pac*_*r21 9 javascript jboss http atmosphere
在开发特定网站时,我在Firefox中加载网站时出现间歇性问题(无法在IE或Chrome中进行比较).该网站加载了几个javascript文件,css样式表,图像等.偶尔,一个或多个文件无法正确加载.响应表示状态为200 OK,但内容长度表示0.这会在不同时间在不同文件上发生.当它是一个无法加载的javascript文件时,该网站无法正常运行,但仍可能显示内容.当它恰好是无法加载的index.html文件时,Firefox会显示一个带有以下html的空白页面:
<html>
<head></head>
<body><pre></pre></body>
</html>
Run Code Online (Sandbox Code Playgroud)
(我相信这是来自Firefox的默认"空"页面视图)
似乎可以从浏览器缓存中正确获取先前成功的加载,并且响应状态为304 Not Modified.失败后,下次请求资源时,我们会看到200 OK的响应状态,后续请求再次响应304.
以下是Firebug报告的请求/响应标头的示例:
一般成功案例:(响应状态:304未修改,内容长度:288)
请求标题:
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en/q=0.5
Connection: keep-alive
Cookie: JSESSIONID=<shouldn't matter>
Host: ???.???.???.???:8442
If-Modified-Since: Tue, 29 Apr 2014 13:18:26 GMT
If-None-Match: W/"228-1398777506000"
Referrer: https://???.???.???.???:8442/mySite/
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20131023 Firefox/17.0
Run Code Online (Sandbox Code Playgroud)
响应标题:
Cache-Control: no-cache
Date: Tue, 29 Apr 2014 13:36:35 GMT
Etag: W/"288-1398777506000"
Expires: Thu, 01 Jan 1970 00:00:00 GMT-00:00
Pragma: No-cache
Server: Apache-Coyote/1.1
Run Code Online (Sandbox Code Playgroud)
缓存中的响应标头:
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 288
Content-Type: text/javascript
Date: Tue, 29 Apr 2014 13:36:35 GMT
Etag: W/"288-1398777506000"
Expires: Thu, 01 Jan 1970 00:00:00 GMT-00:00
Last-Modified: Tue, 29 Apr 2014 13:18:26 GMT
Pragma: No-cache
Server: Apache-Coyote/1.1
Run Code Online (Sandbox Code Playgroud)
Firebug中的"缓存"选项卡指示以下内容:
Data Size: 288
Device: disk
Expires: Wed Dec 31 1969 18:00:00 GMT-06:00 (CST)
Fetch Count: 81
Last Fetched: Tue Apr 29 2014 08:28:35 GMT-05:00 (CDT)
Last Modified: Tue Apr 29 2014 08:28:35 GMT-05:00 (CDT)
Run Code Online (Sandbox Code Playgroud)
失败案例:(响应状态:200 OK,内容长度:0)
请求标题:
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en/q=0.5
Connection: keep-alive
Cookie: JSESSIONID=<same as above>
Host: ???.???.???.???:8442
If-Modified-Since: Tue, 29 Apr 2014 13:18:26 GMT
If-None-Match: W/"228-1398777506000"
Referrer: https://???.???.???.???:8442/mySite/
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20131023 Firefox/17.0
Run Code Online (Sandbox Code Playgroud)
响应标题:
Content-Length: 0
Date: Tue, 29 Apr 2014 13:36:28 GMT
Server: Apache-Coyote/1.1
Run Code Online (Sandbox Code Playgroud)
Firebug中的"缓存"选项卡指示以下内容:
Data Size:
Device: disk
Expires: Wed Dec 31 1969 18:00:00 GMT-06:00 (CST)
Fetch Count: 83
Last Fetched: Tue Apr 29 2014 08:28:42 GMT-05:00 (CDT)
Last Modified: Tue Apr 29 2014 08:28:42 GMT-05:00 (CDT)
Run Code Online (Sandbox Code Playgroud)
下一个成功案例:(响应状态:200 OK,内容长度:288)
请求标题:
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en/q=0.5
Connection: keep-alive
Cookie: JSESSIONID=<same as above>
Host: ???.???.???.???:8442
Referrer: https://???.???.???.???:8442/mySite/
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20131023 Firefox/17.0
Run Code Online (Sandbox Code Playgroud)
响应标题:
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 288
Content-Type: text/javascript
Date: Tue, 29 Apr 2014 13:37:03 GMT
Etag: W/"288-1398777506000"
Expires: Thu, 01 Jan 1970 00:00:00 GMT-00:00
Last-Modified: Tue, 29 Apr 2014 13:18:26 GMT
Pragma: No-cache
Server: Apache-Coyote/1.1
Run Code Online (Sandbox Code Playgroud)
Firebug中的"缓存"选项卡指示以下内容:
Data Size: 288
Device: disk
Expires: Wed Dec 31 1969 18:00:00 GMT-06:00 (CST)
Fetch Count: 85
Last Fetched: Tue Apr 29 2014 08:28:54 GMT-05:00 (CDT)
Last Modified: Tue Apr 29 2014 08:28:53 GMT-05:00 (CDT)
Run Code Online (Sandbox Code Playgroud)
我们在JBoss-EAP v6.1中托管该站点,我在Firefox 10,17和24中尝试了相同的结果.我知道有更新的版本可用(更不用说不同的浏览器),但它们不一定适合我们.我希望解决方案是一个简单的配置更改,但在我尝试搜索此问题时,我没有看到任何人遇到相同的问题,所以它可能不是那么简单.我很感激任何建议.另外,如果我需要提供更多信息,请告诉我(例如,web.xml,jboss.conf等)
混合中的其他产品:
更新:我基本上排除了缓存问题的可能性.我按照RequireJS API页面的建议实现了缓存清理模块加载过程,但我仍然看到了问题.然而,这一次,而不是所有304状态代码,它们都是200.
更新2:我下载了JBossWeb 7.2.0.Final的源代码并完成了调试此问题.显然有一个名为org.apache.coyote.http11.Http11ConnectionHandler的类,它维护一个Http11Processor实例池,每个实例都有自己的Request和Response对象.请求完成后,Http11Processor将被"回收"并重新放入池中.
似乎回收逻辑中可能存在线程问题,因为Response.recycle应该将"committed"设置为false,但是在调用response.recycle()之后我的(条件)断点会随response.committed =而停止=真.这是导致稍后失败的响应的原因.当Http11Processor包含已提交的Response对象时,Response不能用于返回任何信息.它只响应Status:200,Content-Length:0.
当我关闭具有使用服务器端事件的Atmosphere连接的网站时,似乎会发生这种情况.我是否正常使用Atmosphere连接?我应该实施特殊的清理逻辑吗?
经过大量的调查和调试后,我发现Atmosphere库被允许操作一个已被回收并用于以后请求的Response对象.受影响的响应的状态为200,内容长度为0,并且承诺使得不能进行其他修改.给出此"损坏的"响应实例的不幸请求线程无法用于提供实际内容.
为了防止此修改影响JBoss服务器,我将以下内容添加到jboss.properties文件中:
org.apache.catalina.connector.RECYCLE_FACADES=true
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用安全管理器.(见的安全部分该页面,并在最后的几个段落提出的建议此页)
这显然会阻止请求和响应的回收,因此我们总是为每个请求获取一个新的Response实例.
| 归档时间: |
|
| 查看次数: |
21690 次 |
| 最近记录: |