Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jetty CORS在带有Comed的Heroku上运行良好,但在Comed返回时失败_Heroku_Cross Domain_Jetty_Cors_Cometd - Fatal编程技术网

Jetty CORS在带有Comed的Heroku上运行良好,但在Comed返回时失败

Jetty CORS在带有Comed的Heroku上运行良好,但在Comed返回时失败,heroku,cross-domain,jetty,cors,cometd,Heroku,Cross Domain,Jetty,Cors,Cometd,我在Heroku上使用Jetty Runner运行Java应用程序(我们称之为网站a) 然后我在网站B上运行了一个Web应用程序,使用Cometd连接到a Comet连接保持打开状态30秒,如果没有从服务器接收到数据,它将返回 我在Jetty的web.xml上设置了CORS参数,这样B就可以毫无问题地访问A 现在的问题是:如果comet的30秒结束,而服务器没有返回任何内容,那么浏览器会抛出此错误: XMLHttpRequest cannot load [Website A]/cometd.

我在Heroku上使用Jetty Runner运行Java应用程序(我们称之为网站a)

然后我在网站B上运行了一个Web应用程序,使用Cometd连接到a

Comet连接保持打开状态30秒,如果没有从服务器接收到数据,它将返回

我在Jetty的web.xml上设置了CORS参数,这样B就可以毫无问题地访问A

现在的问题是:如果comet的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.   
我在另一个网站(网站C)上使用嵌入式Jetty运行相同的Java应用程序,使用相同的CORS设置,一切正常。特别是,当comet连接在30秒后返回时,响应具有包括“Access Control Allow Origin”在内的所有标头。但是,在网站A上,comet返回后,响应没有标题

因此,对我来说,问题是由于Jetty Runner在30秒后没有返回响应,而嵌入式Jetty返回的响应标题正确。

My 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>

交叉起源
org.eclipse.jetty.servlets.CrossOriginFilter
允许起源
[网站B]
允许的方法
获取、发布、删除、放置、标题、选项
允许的标题
来源、内容类型、缓存控制、接受
交叉起源
/*
降临
org.cometd.server.CometdServlet
对数电平
0
超时
30000
金星虫
错误的
1.
降临
/降临/*
管理
org.coweb.servlet.AdminServlet
2.
配置URI
/WEB-INF/cowebConfig.json
管理
/管理员/*

你知道怎么解决这个问题吗

如果A没有为B发送
访问控制允许来源
头,但为C发送,可能是您的CORS配置错误

您没有指定如何在上配置CORS(是否使用Jetty?)


我看不出为什么Jetty Runner(它只是一个部署war的嵌入式Jetty)会干扰web应用程序的CORS配置?

是的,我正在使用CrossOriginFilter。我通过添加应用程序的web.xml文件的内容更新了我的问题。你能看一下吗?
web.xml
看起来不错。您是否尝试为CORS筛选器启用调试日志记录?这应该会告诉你是否添加了头,如果没有,为什么不添加。我猜浏览器在收到服务器的响应前30秒终止了连接。我把30000换成25000,问题就解决了。