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