Я бегу приложение Java с Jetty-Runner на Heroku (давайте назовем его сайт A)Jetty CORS отлично работает на Heroku с cometd, но терпит неудачу, когда cometd возвращает
Тогда у меня есть веб-приложение работает на веб-сайте B, подключение к A с помощью Cometd.
Соединение кометы остается открытым в течение 30 секунд, а затем оно возвращается, если данные не получены с сервера.
У меня есть параметры CORS на web.xml Jetty, так что B обращается к A без проблем.
Теперь проблема: , если 30 секунд заканчивается кометы и сервер не возвращает ничего, то браузер выдает эту ошибку:
XMLHttpRequest cannot load [Website A]/cometd.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin '[Website B]' is therefore not allowed access.
Я бегу тот же Java-приложения с помощью встроенного Jetty на другой Веб-сайт (веб-сайт C) с теми же настройками CORS и все работает нормально. В частности, когда кометное соединение возвращается через 30 секунд, в ответе есть все заголовки, включая «Access-Control-Allow-Origin». Но, на сайте А, после возвращения кометы, ответ не имеет заголовков.
Так, для меня проблема вызвана тем,
Мой контент web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<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>[Website B]</param-value>
</init-param>
<init-param>
<param-name>allowedMethods</param-name>
<param-value>GET,POST,DELETE,PUT,HEAD,OPTIONS</param-value>
</init-param>
<init-param>
<param-name>allowedHeaders</param-name>
<param-value>origin, content-type, cache-control, accept</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>cross-origin</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>cometd</servlet-name>
<servlet-class>org.cometd.server.CometdServlet</servlet-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>timeout</param-name>
<param-value>30000</param-value>
</init-param>
<init-param>
<param-name>jsonDebug</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!--
To use async-supported in a servlet 3.0 compliant container,
uncomment the following tag:
<async-supported>true</async-supported>
and change the web-app tag of this document to:
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
-->
</servlet>
<servlet-mapping>
<servlet-name>cometd</servlet-name>
<url-pattern>/cometd/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>admin</servlet-name>
<servlet-class>org.coweb.servlet.AdminServlet</servlet-class>
<load-on-startup>2</load-on-startup>
<init-param>
<param-name>ConfigURI</param-name>
<param-value>/WEB-INF/cowebConfig.json</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>admin</servlet-name>
<url-pattern>/admin/*</url-pattern>
</servlet-mapping>
</web-app>
Любая идея, как решить эту probem?
Да, я использую CrossOriginFilter. Я обновил свой вопрос, добавив содержимое файла web.xml приложения. Можете ли вы взглянуть на него? –
«web.xml» выглядит хорошо. Вы пытались включить ведение журнала отладки для фильтра CORS? Это должно сказать вам, если заголовки добавлены, а если нет, почему бы и нет. – sbordet
Я догадался, что браузер завершил соединение правильно на 30 секунд, прежде чем получить ответ от сервера. Я изменил 30000 param-value> на 25000 param-value>, и проблема исчезла. –