【问题标题】:Jetty CORS works fine on Heroku with cometd but fails when cometd returnsJetty CORS 在 Heroku 上使用 cometd 运行良好,但在 cometd 返回时失败
【发布时间】:2014-01-13 05:03:41
【问题描述】:

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

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

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

我已经在 J​​etty 的 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.   

我在另一个具有相同 CORS 设置的网站(网站 C)上使用 Embedded Jetty 运行相同的 Java 应用程序,并且一切正常。特别是,当彗星连接在 30 秒后返回时,响应包含所有标头,包括“Access-Control-Allow-Origin”。但是,在网站 A 上,彗星返回后,响应没有标头。

所以,对我来说,问题是由于 Jetty-Runner 在 30 秒后没有返回响应,而不是嵌入式码头返回带有正确标头的响应。

我的 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>

知道如何解决这个问题吗?

【问题讨论】:

    标签: heroku cross-domain jetty cors cometd


    【解决方案1】:

    如果 A 没有为 B 发送 Access-Control-Allow-Origin 标头,但它为 C 发送了,可能是您的 CORS 配置错误?

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

    我看不出为什么 Jetty Runner(它只是一个嵌入的 Jetty,用于部署你的战争)应该与 Web 应用程序的 CORS 配置混淆?

    【讨论】:

    • 是的,我正在使用 CrossOriginFilter。我通过添加应用程序的 web.xml 文件的内容来更新我的问题。可以看看吗?
    • web.xml 看起来不错。您是否尝试为 CORS 过滤器启用调试日志记录?这应该会告诉您是否添加了标题,如果没有,为什么不添加。
    • 我猜测浏览器在收到服务器响应之前的 30 秒就终止了连接。我将 30000 更改为 25000 问题就消失了。
    猜你喜欢
    • 2012-09-26
    • 2012-01-20
    • 1970-01-01
    • 2014-01-01
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2020-08-03
    相关资源
    最近更新 更多