2012-04-28 31 views
9

Ho una semplice app (servlet java) ospitata su GAE. L'app restituisce i dati JSON. Ho impostato le informazioni di intestazione come segue nel servlet:Google App Engine e CORS

resp.setContentType("application/json"); 
resp.setHeader("Access-Control-Allow-Origin", "*"); 
resp.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); 
resp.setHeader("Access-Control-Allow-Credentials", "true"); 

Ecco le informazioni di intestazione quando vado al URL direttamente sul motore app:

Request Method:GET 
Status Code:200 OK 
Request Headersview source 
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Cache-Control:max-age=0 
Connection:keep-alive 
Host:---------.appspot.com 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko)   Chrome/18.0.1025.162 Safari/535.19 
Response Headersview source 
Access-Control-Allow-Credentials:true 
Access-Control-Allow-Methods:GET, POST, OPTIONS 
Access-Control-Allow-Origin:* 
Cache-Control:private 
Content-Encoding:gzip 
Content-Length:340 
Content-Type:application/json; charset=ISO-8859-1 
Date:Sat, 28 Apr 2012 19:14:58 GMT 
Server:Google Frontend 
Vary:Accept-Encoding 

Ma quando provo ad accedere all'URL da un dominio diverso ottengo la seguente risposta:

Request Method:OPTIONS 
Status Code:500 Internal Server Error 
Request Headersview source 
Accept:*/* 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Access-Control-Request-Headers:origin, x-requested-with, accept 
Access-Control-Request-Method:GET 
Connection:keep-alive 
Host:----------.appspot.com 
Origin:http://--------------.com 
Referer:http://-------------.com/map/ 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.162 Safari/535.19 
Response Headersview source 
Content-Length:466 
Content-Type:text/html; charset=UTF-8 
Date:Sat, 28 Apr 2012 19:15:14 GMT 
Server:Google Frontend 

qui è l'errore esatto:

XMLHttpRequest cannot load http://----------.appspot.com/Locations. Origin http://-------------.com is not allowed by Access-Control-Allow-Origin. 

Il codice che tenta di accedere all'URL GAE si presenta così:

$.getJSON("http://---------appspot.com/Locations",function(result){ 
    for (i=0; i < result.length; i++) 

Qualsiasi aiuto sarebbe molto grato.

+0

La vostra applicazione restituisce un 500, che probabilmente significa che è un'eccezione non rilevata. Controlla i tuoi log per capire perché. –

risposta

7

È necessario sostituire il metodo standard HttpServlet.doOptions() per supportare pre-flight request processing corretto.

@Override 
protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
{ 
    // pre-flight request processing 
    resp.setHeader("Access-Control-Allow-Origin", "*"); 
    resp.setHeader("Access-Control-Allow-Methods", SUPPORTED_METHODS); 
    resp.setHeader("Access-Control-Allow-Headers", SUPPORTED_HEADERS); 
} 

@Override 
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
{ 
    resp.setHeader("Access-Control-Allow-Origin", "*"); 
    resp.setContentType("application/json"); 

    // implementation... 
} 
3

Sembra che la richiesta non riesca in anticipo, su un preflight request, perché il server risponde con 500 (dovrebbe rispondere con 200 + intestazioni specifiche) quando richiesto OPTIONS <URL>.

Si potrebbe voler verificare HTML5rocks tutorial on CORS, in particolare Aggiunta del supporto CORS al server, dove viene spiegata la richiesta di preflight (la richiesta OPTIONS <url>, su cui l'app non riesce a rispondere con 200 + intestazioni richieste).

0

Questa è un'altra soluzione (lavoro per me):

  1. supporto Config CORS nel progetto del motore Java App:

Con mvn mettere nel file pom.xml:

<!-- CORS Support for Jetty --> 
<dependency> 
    <artifactId>jetty-servlets</artifactId> 
    <groupId>org.eclipse.jetty</groupId> 
    <version>9.2.22.v20170606</version> 
</dependency> 

Oppure con file jar scaricato: jetty-servlets.jar, inserirlo nel WEB-INF/lib

  1. Config file web.xml:

    <filter> <filter-name>cross-origin</filter-name> <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class> <init-param> <param-name>allowedOrigins</param-name> <param-value>*</param-value> </init-param> <init-param> <param-name>allowedMethods</param-name> <param-value>GET,POST,HEAD</param-value> </init-param> <init-param> <param-name>allowedHeaders</param-name> <param-value>X-Requested-With,Content-Type,Accept,Origin</param-value> </init-param> </filter> <filter-mapping> <filter-name>cross-origin</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

Forse avete bisogno di cambiare allowedOrigins valore del campo con un URL personalizzato.

Questo è tutto, costruire e felice codifica.

Per informazioni adizionale:How to add Access-Control-Allow-Origin to jetty server