2014-01-10 61 views
1

我正在與碼頭,亞軍在Heroku Java應用程序失敗(我們稱之爲網站)碼頭CORS正常工作在Heroku用的cometd但是當的cometd返回

然後,我有一個Web應用程序上的網站B上運行,使用Cometd連接到A。

Comet連接保持打開狀態30秒,然後在沒有收到服務器數據的情況下返回。

我在Jetty的web.xml中設置了CORS參數,以便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應用程序網站(網站C)具有相同的CORS設置,一切正常。特別是,當彗星連接在30秒後返回時,響應具有包括'Access-Control-Allow-Origin'的所有標題。但是,在網站A上,comet返回後,響應沒有標題。

所以,對我來說,這個問題是由Jetty Runner在30秒後沒有返回響應引起的,而嵌入式jetty則是以正確的頭文件返回響應。

我的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沒有發送B的Access-Control-Allow-Origin標題,但它對C來說可能是你的CORS配置是錯誤的?

您沒有指定如何在A上配置CORS(您使用的是Jetty的CrossOriginFilter?)。

我看不出爲什麼Jetty Runner(這只是一個部署你的戰爭的Jetty嵌入式應用程序)應該與Web應用程序的CORS配置混淆?

+0

是的,我正在使用CrossOriginFilter。我通過添加應用程序的web.xml文件的內容來更新我的問題。你可以看看嗎? –

+0

'web.xml'看起來不錯。您是否嘗試啓用CORS過濾器的調試日誌記錄?這應該告訴你,如果標題被添加,如果沒有,爲什麼不。 – sbordet

+0

我猜想,在收到服務器的響應之前,瀏覽器正在終止30秒的連接。我將 30000更改爲 25000,問題就消失了。 –