“未修改”标头后跟带有 sitemesh3 和 mod-jk 的意外内容正文

2024-01-05

在我的 Java / Struts2 / Tomcat 应用程序中,当请求某些生成“304 Not Modified”响应的资源时,该文件仍在响应中发送。

这是使用 Fiddler 捕获的响应示例:

HTTP/1.1 304 Not Modified
Date: Thu, 26 Jun 2014 11:27:27 GMT
Server: Apache/2.2.16 (Ubuntu)
Connection: Keep-Alive
Keep-Alive: timeout=15, max=100
Vary: Accept-Encoding

/*! jQuery v1.7.2 jquery.com | jquery.org/license */
(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9? 
a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("
<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||
[...]

这是一个问题,因为返回的文件的内容被插入到下一个请求的文件中,最终导致损坏和奇怪的行为。

这只发生在从“/struts”路径加载的资源上,例如:

/struts/utils.js
/struts/js/base/jquery-1.10.2.min.js
/struts/js/base/jquery.ui.core.min.js?s2j=3.7.0

“/struts”路径由struts2类处理

org.apache.struts2.dispatcher.DefaultStaticContentLoader

这些是系统的相关元素:

  • Ubuntu 12.04.4 LTS(GNU/Linux 3.5.0-27-通用 x86_64)
  • JVM 1.6.0_31-b31 Sun Microsystems Inc.(也尝试使用 ibm-java-x86_64-71)
  • Apache2 2.2.22-1ubuntu1.6 带 modjk
  • 阿帕奇汤姆猫/6.0.35
  • 支柱 2.3.16
  • 网网3.0.0

直接连接到 tomcat 时,在 Not Modified 标头之后我没有收到任何意外数据。

Apache 服务器配置没有太大修改,只是 /contents 的别名和两个 modjk 指令:

JkMount /* ajp13_worker
JkUnMount /contents/* ajp13_worker

没有任何与 /struts 或缓存或任何异国情调相关的内容。 ModJK 配置是默认设置。

有什么建议吗?


这个答案并没有解决问题,反而提出了新的问题。

在 apache 服务器后面使用 sitemesh3 时,会发生响应损坏。 如果我直接访问 tomcat 服务器,响应是干净的 304。 如果我通过 modjk/apache 访问,响应将包含意外数据。

意外数据的原因在于 sitemesh 的工作方式:发送响应时,在某些时候它会强制 struts 忽略任何“If-Modified-Since”标头,将请求的内容写入响应缓冲区。然后继续在缓冲区的开头添加 304 标头。

首先看一下

org.sitemesh.webapp.contentfilter.HttpServletRequestFilterable
org.apache.struts2.dispatcher.DefaultStaticContentLoader.process()

我不知道从这里该去哪里。这是一个错误吗?是 Apache Server 错误、Tomcat 错误、Struts 错误还是 Sitemesh 错误?!

要复制该问题,您需要在 apache 后面有一个 tomcat,运行一个带有 sitemesh 的 struts web 应用程序,并在 fiddler2 处于活动状态时获取此 url 两次:

http://[test.server.address]/struts/utils.js

小菜一碟o_O'

Edit:

如果我检查 modjk 日志,我可以清楚地看到传输回 Apache 服务器的文件:

: trying to connect socket 29 to 127.0.0.1:9009                                                     
: socket 29 [127.0.0.1:57195 -> 127.0.0.1:9009] connected                                           
: sending to ajp13 pos=4 len=581 max=8192                                      
.4.A....HTTP/1.1  
.../struts/utils  
.js...2.235.97.2  
[...]
...Accept-Langua  
ge..#en,en-US;q=  
0.8,it-IT;q=0.6,  
it;q=0.4....+JSE  
SSIONID=B77369AB  
D8239724A27A5CC5  
6E06DED8...If-Mo  
dified-Since...F  
ri,.27.Jun.2014.  
08:37:46.GMT....  
.0....AJP_REMOTE  
_PORT...19143...  
.JK_LB_ACTIVATIO  
N...............  
: (rdp_worker) request body to send 0 - request body to resend 0                              
: received from ajp13 pos=0 len=20 max=8192                                     
..0..Not.Modifie   
d...............   
: status = 304                                                                           
: Number of headers is = 0                                                               
: received from ajp13 pos=0 len=4767 max=8192                                   
.../*..*.$Id:.ut   
ils.js.1240312.2   
012-02-03.19:44:   
51Z.jogep.$..*..   
*.Licensed.to.th   
e.Apache.Softwar   
e.Foundation.(AS   
F).under.one..*.   
or.more.contribu   
tor.license.agre   
ements...See.the   
[...]   
the.ajaxValidati   
on.interceptor.S   
trutsUtils.getVa   
lidationErrors.=   
: ws_write::mod_jk.c (537): written 4763 out of 4763                                                                                    
: received from ajp13 pos=0 len=4 max=8192                                      
................   
: received from ajp13 pos=0 len=2 max=8192                                      
................   
: AJP13 protocol: Reuse is OK 

当我直接访问 tomcat 并使用 tcpflow 转储 TCP 流量时,我没有看到任何虚假数据:

# tcpflow -p -s -c host xxx.xxx.xxx.xxx and port 8080

xxx.xxx.xxx.xxx.19292-yyy.yyy.yyy.yyy.08080: GET /rdp/struts/utils.js HTTP/1.1
Host: xxx.net:8080
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en,en-US;q=0.8,it-IT;q=0.6,it;q=0.4
Cookie: JSESSIONID=B0F02CXXXEC3448F1B927C0E8C579A9B
If-Modified-Since: Fri, 27 Jun 2014 08:49:23 GMT


yyy.yyy.yyy.yyy.08080-xxx.xxx.xxx.xxx.19292: HTTP/1.1 304 Not Modified
Server: Apache-Coyote/1.1
Date: Fri, 27 Jun 2014 08:52:43 GMT

因此,将缓冲区返回到 ajp 端口和将其返回到网络套接字似乎有不同的行为。这对我来说太低了,无法进一步发展。

Edit:

解决方法

我实现的解决方法是让 Apache Server 处理 /struts 上下文:

  • 从 struts 和 struts-jquery-plugin jars 中提取所有受影响的文件(分别是 org\apache\struts2\static 的内容和 template 的内容)
  • 将这些文件复制到服务器上的目录中
  • 在 apache 中创建一个别名,以便在遇到 /struts 路径时为该目录提供服务
  • 从 modJK 取消映射 /struts 路径
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“未修改”标头后跟带有 sitemesh3 和 mod-jk 的意外内容正文 的相关文章

  • Servlet 包含 Tomcat 中的 HTTP 标头

    我有一个 servlet 它的请求调度程序包含另一个 servlet 包含的 servlet 设置了我想在包括小服务程序 因此 我在 include 方法中传入一个自定义 HTTPResponse 对象 该对象捕获来自 servlet 的所
  • Python:从 apache authnz_ldap 获取用户

    我正在通过 Apache2 的 authnz ldap 模块成功验证 ldap 用户 我不清楚如何在他们登录后获取他们的用户名 以便我可以通过任何以下表单 网页与他们交互 我尝试过典型的方法 os getenv os environ get
  • Struts 2 中的 Java 应用程序可以管理多少个会话?

    我正在开发事务管理应用程序 并且正在使用 Struts2 我在内部使用了一个会话来设置和获取值 例如 ActionContext getContext getSession put string string 在应用程序中使用这样的会话是否
  • 绕过带index.php和不带index.php的url的htpasswd身份验证

    我已经使用 htaccess 文件添加了 htpasswd 保护进行身份验证 现在我想绕过身份验证www website com and www website com index php其中两个 url 都在访问 index php 文件
  • Postman - 所需的 MultipartFile 参数不存在 - Spring,Java [重复]

    这个问题在这里已经有答案了 Edit 这个问题不同于 jQuery Ajax 文件上传 所需的 MultipartFile 参数 文件 不存在 https stackoverflow com q 29488852 2279082不同之处在于
  • Tomcat 8 中的多部分文件最大大小配置[重复]

    这个问题在这里已经有答案了 我的应用程序服务器是 Tomcat 我需要将文件 大尺寸 上传到我的应用程序 车身尺寸为POSTrequests 确实很长 大约 15 MB 或更多 我可以设置任何类型的配置或代码来解决这个问题吗 请记住 这是m
  • 就MVC模式而言,Struts 2中使用的Action是什么?

    在Struts2中 控制器将请求分派给Action Action将其传递给后端逻辑 这可以看作是一个非常大的过程 model 处理请求 JSP代表视图 Struts2中如何定义Action 肯定是not一个看法 是控制器还是模型 Strut
  • Django 与 mod_wsgi 在 apache - 500 错误:Authtype 未设置?

    尝试在 Dreamhost 上部署我的第一个 django 站点 我的这个工作正常 然后我不确定我做了什么让它停止工作 这是错误消息 crit client 74 72 99 26 configuration error couldn t
  • tomcat 7 + ssl 不工作 - ERR_SSL_VERSION_OR_CIPHER_MISMATCH

    Ubuntu 14 tomcat 7 java 7 our crt our key 和 gd bundle g2 g1 crt 由 godaddy 提供 该捆绑包中有 3 个证书 通过查看文件可以看出 请注意 我们的密钥和 crt 在 no
  • 保存到服务器后,隐藏字符“\u0”添加到文件中

    我正在使用 Apache 服务器为 Web 开发网站提供服务 这样我就可以不断保存和编辑文件 我使用 Gulp for Sass 来连接和丑化 css 和 js 文件 一个月前 我的 js 和 css 文件遇到问题 似乎在文件下面添加了随机
  • 使用 Netty 将 websocket 与在 tomcat 中运行的 Spring Web 应用程序集成

    我有一个使用 Netty 的 Web 套接字服务器实现 例如监听端口 8081 和一个在 Tomcat 中运行的单独的 Spring Web 应用程序 在端口 80 中运行 我想以某种方式将所有来自 localhost 80 Websock
  • PHP:如何访问根目录之外的下载文件夹? [复制]

    这个问题在这里已经有答案了 我如何创建一个 PHP 脚本 页面 允许会员 买家下载存储在根目录之外的下载文件夹中的压缩文件 产品 我正在使用 Apache 服务器 请帮忙 谢谢 保罗 G 您可能会在 soac 提供的链接中找到一些更好的信息
  • Internet Explorer 8 + 放气

    我有一个非常奇怪的问题 我真的希望有人能给出答案 因为我不知道还能去哪里问 我正在用 C 编写一个 cgi 应用程序 它由 Apache 执行并输出 HTML 代码 我自己在 C 应用程序中压缩 HTML 输出 因为我的 Web 主机由于某
  • 文件保存在文件系统中 VS 保存在数据库中

    我正在设计一个 servlet 或 Struts2 中的操作 用于文件 图像 文档等 下载 但我想知道哪种更好的方法可以将文件保留在文件系统和数据库中 只需保留文件的路径或将文件保留在数据库中 如 BLOB 我知道当我查询数据库时 哪里的
  • 请求标头与响应标头

    我正在尝试将图像缓存在网站上 该图像由 PHP 提供服务 其中我使用适当的值设置缓存控制的响应标头 但这不是缓存图像 我认为这可能与具有无缓存缓存控制的请求标头有关 标题如下 响应头 Access Control Allow Origin
  • SSE(EventSource):为什么不超过6个连接?

    我想看看在我的机器超载之前我可以设置多少个并发 SSE 又名 EventSource 连接 但使用 Firefox Firefox 18 或 Firefox 20 进行测试时 它在 6 个连接处停止 附加连接没有给出错误 但不发送任何数据
  • 如何正确配置Tomcat SSLHostConfig?

    我正在按照本教程在 tomcat 中启用 ssl https medium com raupach how to install lets encrypt with tomcat 3db8a469e3d2 https medium com
  • Http POST 删除 URL 中的端口

    我有一个用 Django 构建的网络应用程序 我目前正在家里的路由器后面的笔记本电脑上运行它 我将路由器配置为将发送到特定端口的所有流量路由到该笔记本电脑 我将 Nginx 作为 Apache 的反向代理 使用 mod wsgi 来运行 D
  • 为什么我们在同一台服务器上使用多个应用程序服务器实例

    我想这是有充分理由的 但我不明白为什么有时我们会在同一物理服务器上放置例如 5 个具有相同 Web 应用程序的实例 这与多处理器架构的优化有关吗 JVM 或其他允许的最大内存限制 嗯 过了很长一段时间我又看到这个问题了 一台机器上的多个 J
  • PHP 文件由浏览器下载,而不是由本地开发服务器(MAMP)处理

    一切都很顺利 直到我添加AddHandler application x httpd php5s php到本地服务器文档根目录中的 htaccess 文件 根据我正在使用的站点 我经常更改该文件 因为我访问时这样做了http 本地主机 88

随机推荐