2014-01-10 4 views
1

Я бегу приложение 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?

ответ

0

Если A не отправляет заголовок Access-Control-Allow-Origin для B, но он подходит для C, возможно, ваша конфигурация CORS неверна?

Вы не указали, как вы настроили CORS на A (используете ли вы Jetts's CrossOriginFilter?).

Я не вижу причин, почему Jetty Runner (который является только Jetty, который развертывает вашу войну) должен испортить конфигурацию CORS веб-приложения?

+0

Да, я использую CrossOriginFilter. Я обновил свой вопрос, добавив содержимое файла web.xml приложения. Можете ли вы взглянуть на него? –

+0

«web.xml» выглядит хорошо. Вы пытались включить ведение журнала отладки для фильтра CORS? Это должно сказать вам, если заголовки добавлены, а если нет, почему бы и нет. – sbordet

+0

Я догадался, что браузер завершил соединение правильно на 30 секунд, прежде чем получить ответ от сервера. Я изменил 30000 на 25000, и проблема исчезла. –