Вопрос по java, jquery – Google App Engine и CORS
У меня есть простое приложение (сервлет 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>
Любая помощь будет очень признателен.
я поддержки правильного предполетная обработка запросов.
@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...
}
предварительный запрос, потому что сервер отвечает 500 (он должен отвечать более 200 заголовками) при запросеOPTIONS <URL>
.
Ты можешь захотеть проверить HTML5rocks учебник по CORS, в частности Добавление поддержки CORS на сервер, где объясняется предполётный запрос OPTIONS <url>
запрос, на который ваше приложение не может ответить с 200 + необходимыми заголовками).
Настройка поддержки 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