Вопрос по java, jquery – Google App Engine и CORS

10

У меня есть простое приложение (сервлет Java), размещенное на GAE. Приложение возвращает данные JSON. Я установил информацию заголовка следующим образом в сервлете:

<code>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");
</code>

Вот информация заголовка, когда я перехожу к URL-адресу непосредственно в движке приложения:

<code>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
</code>

Но когда я пытаюсь получить доступ к URL из другого домена, я получаю следующий ответ:

<code>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
</code>

вот точная ошибка:

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

Код, который пытается получить доступ к URL-адресу GAE, выглядит следующим образом:

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

Любая помощь будет очень признателен.

Ваше приложение возвращает 500, что, вероятно, означает, что оно генерирует необработанное исключение. Проверьте свои журналы, чтобы понять почему. Nick Johnson

Ваш Ответ

3   ответа
9

я поддержки правильного предполетная обработка запросов.

@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

предварительный запрос, потому что сервер отвечает 500 (он должен отвечать более 200 заголовками) при запросеOPTIONS <URL>.

Ты можешь захотеть проверить HTML5rocks учебник по CORS, в частности Добавление поддержки CORS на сервер, где объясняется предполётный запрос OPTIONS <url> запрос, на который ваше приложение не может ответить с 200 + необходимыми заголовками).

1

Настройка поддержки CORS в вашем проекте Java App Engine:

С mvn вставьте в ваш файл pom.xml:

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

Или с загруженным файлом jar: Пристань-servlets.jar, вставь в свой WEB-INF / lib

Настройте файл 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>

Может быть, вам нужно изменить AllowedOrigins значение поля с пользовательским URL.

Вот и все, строй и удачного кодирования.

Дополнительная информация: Как добавить Access-Control-Allow-Origin на сервер Jetty

А если у нас нет файла web.xml? Prasanna
Файл web.xml необходим для веб-приложений Java. Heberth
в новейшей технологии сервлетов .. нам не нужно поддерживать файл web.xml вместо того, чтобы пометить его как "@WebServlet", "@WebListener" и т. д. Prasanna
Понятно, тогда тебе нужно знать, как разместить аннотацию для CORS. Heberth

Похожие вопросы