3

Ich versuche zu get json Daten impliment von einer geruhsamen URL von localhost mit AngularJS-1-Anwendung zu schlagen.Wie Cross-Origin Resource Sharing (CORS) im Spiel-Framework 2.5.x

Ich erhalte diesen Fehler

http://localhost:9000/mlm/user/all Failed to load resource: 
the server responded with a status of 404 (Not Found) 

index.html:1 XMLHttpRequest cannot load http://localhost:9000/mlm/user/all. 

Response to preflight request doesn't pass access control check: 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 

Origin 'http://localhost:63342' is therefore not allowed access. 

The response had HTTP status code 404. 

Ich verwende Play-Framework 2.5.4 (Java).

Edit 1: Hinzugefügt CORS Einstellungen

play.filters { 
    cors { 
    # Filter paths by a whitelist of path prefixes 
    pathPrefixes = ["/"] 

    # The allowed origins. If null, all origins are allowed. 
    allowedOrigins = null 

    # The allowed HTTP methods. If null, all methods are allowed 
    allowedHttpMethods = ["GET", "POST"] 

    allowedHttpHeaders = ["Accept"] 
    preflightMaxAge = 3 days 
    } 
} 

Antwort

6

Schließlich arbeitete das für mich.

Nach official docs

Filter.java ist (hat nicht funktioniert):

import play.mvc.EssentialFilter; 
import play.filters.cors.CORSFilter; 
import play.http.DefaultHttpFilters; 

import javax.inject.Inject; 

public class Filters extends DefaultHttpFilters { 
    @Inject public Filters(CORSFilter corsFilter) { 
     super(corsFilter); 
    } 
} 

Aber es funktionierte DINT. Was gearbeitet ist:

Filter.java (arbeitete)

import play.mvc.EssentialFilter; 
import play.filters.cors.CORSFilter; 
import play.http.HttpFilters; 
import javax.inject.Inject; 

public class Filters implements HttpFilters { 

    @Inject 
    CORSFilter corsFilter; 

    public EssentialFilter[] filters() { 
     return new EssentialFilter[] { corsFilter.asJava() }; 
    } 
} 

dank this Antwort, ähnliche Frage auf Stack-Überlauf.

Aber warum der Filter.java Code von offiziellen docs für 2.5.x nicht funktioniert, ist die Frage von Millionen Dollar?

0

app.conf Ich glaube, Sie setzen müssen, um eine CORS-Header in Ihrem Server erlauben:

response.setHeader("Access-Control-Allow-Origin", "*");//cross domain request/CORS 

Sie wissen nicht, den Rahmen Sie sind Verwenden Sie, aber irgendwo sollten Sie Zugriff auf das Antwortobjekt haben und dann etwas wie das schreiben.

Darüber hinaus führen die meisten Clients eine http OPTIONS-Anforderung vor der tatsächlichen Anforderung durch, um nach unterstützten Optionen und Zugriff auf den Server zu suchen. Sie müssen die vollständige Anforderung nicht verarbeiten, wenn Sie sehen, dass die HTTP-Methode OPTIONS ist. Einfach die Header ausschreiben und den Socket/Verbindung schließen.

0

Es ist sehr documented.

Der Filter kann von application.conf konfiguriert werden. Zum Beispiel:

play.filters.cors { 
    pathPrefixes = ["/some/path", ...] 
    allowedOrigins = ["http://www.example.com", ...] 
    allowedHttpMethods = ["GET", "POST"] 
    allowedHttpHeaders = ["Accept"] 
    preflightMaxAge = 3 days 
} 



play.filters { 
    cors { 
    # Filter paths by a whitelist of path prefixes 
    pathPrefixes = ["/"] 

    # The allowed origins. If null, all origins are allowed. 
    allowedOrigins = null 

    # The allowed HTTP methods. If null, all methods are allowed 
    allowedHttpMethods = ["GET", "POST", "OPTIONS"] 

    preflightMaxAge = 3 days 
    } 
} 
+0

Was ist "pathPrefixes"? –

+0

hinzugefügt diese Zeile immer noch den gleichen Fehler –

+0

Preflight-Anfrage verwendet Optionen-Methode, versuchen, Optionen zu allowedHttpMethods – Mikalai

2

Scheint, es ist ein Fehler im Framework mit der Besetzung von DefaultHttpFilters.java https://github.com/playframework/playframework/pull/6238

Stellen Sie sicher, dieser Anleitung folgen: https://www.playframework.com/documentation/2.5.x/CorsFilter

Aber verwenden Sie nicht die Standardimplementierung von DefaultHttpFilters stattdessen verwenden Sie die folgende:

package filters; 
import play.http.*; 

import java.util.Arrays; 

import play.mvc.EssentialFilter; 

/** 
* Helper class which has a varargs constructor taking the filters. Reduces boilerplate for defining HttpFilters. 
*/ 
public class MyDefaultHttpFilters implements HttpFilters { 

    private final EssentialFilter[] filters; 

    public MyDefaultHttpFilters(play.api.mvc.EssentialFilter... filters) { 
    this.filters = Arrays.stream(filters).map(f -> f.asJava()).toArray(EssentialFilter[]::new); 
    } 

    @Override 
    public EssentialFilter[] filters() { 
    return filters; 
    } 
} 

wird Ihre Filterklasse dann suchen müssen wie folgt:

import javax.inject.*; 
import play.mvc.EssentialFilter; 
import play.filters.cors.CORSFilter; 
import filters.MyDefaultHttpFilters; 

public class Filters extends MyDefaultHttpFilters { 
    @Inject public Filters(CORSFilter corsFilter) { 
     super(corsFilter); 
    } 
} 
+0

hinzufügen, danke wird es ausprobieren. –