Jetty CORS在使用cometd的Heroku上运行良好,但在cometd返回时失败



我正在Heroku上运行一个带有Jetty Runner的Java应用程序(我们称之为网站a)

然后我在网站B上运行了一个Web应用程序,使用Comed连接到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.   

我在另一个网站(网站C)上使用Embedded Jetty运行相同的Java应用程序,使用相同的CORS设置,一切都很好。特别是,当comet连接在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>

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

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

您没有说明如何在A上配置CORS(您是否使用Jetty的CrossOriginFilter?)。

我看不出有什么理由让JettyRunner(它只是一个部署战争的嵌入式Jetty)扰乱web应用程序的CORS配置?

相关内容

最新更新