Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 由Apache代理时导致连接重置的Struts2 POST_Java_Apache_Tomcat_Struts2_Mod Proxy - Fatal编程技术网

Java 由Apache代理时导致连接重置的Struts2 POST

Java 由Apache代理时导致连接重置的Struts2 POST,java,apache,tomcat,struts2,mod-proxy,Java,Apache,Tomcat,Struts2,Mod Proxy,当通过Apache HTTP服务器代理向我们的Struts2(2.3.15.2)应用程序发布(或获取)某些简单文本值时,我们在浏览器中收到一条“连接已重置”消息(Firebug报告为中止请求)。似乎从未联系过服务器(apache的访问/错误日志中没有失败请求的条目) 奇怪的是,只有某些字符串值触发此错误。我们发现,以下关键词:control、find、services与以下符号组合时:“;|”会导致错误。例如,值control;会导致错误,但不会导致test; 或者更复杂的例子: string

当通过Apache HTTP服务器代理向我们的Struts2(2.3.15.2)应用程序发布(或获取)某些简单文本值时,我们在浏览器中收到一条“连接已重置”消息(Firebug报告为中止请求)。似乎从未联系过服务器(apache的访问/错误日志中没有失败请求的条目)

奇怪的是,只有某些字符串值触发此错误。我们发现,以下关键词:
control、find、services
与以下符号组合时:
“;|”
会导致错误。例如,值
control;
会导致错误,但不会导致
test;

或者更复杂的例子:

string containing the word find and a special character like >
导致错误,但不是:

string containing the word notfind and a special character like >
当我们通过tomcat直接访问应用程序时,我们不会遇到这个问题。

我们部署了一个简单的struts2 java web应用程序,其中包含最基本的视图/控制器,试图隔离我们遇到的问题。以下是视图:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page</title>
  </head>
  <body>
    <form action="test.action" method="post">
      Value: <textarea type="text" name="value"></textarea> <input type="submit"/>
    </form>

    <hr/>
    Value is: ${value}
  </body>
</html>
我们使用mod_proxy和mod_proxy_ajp运行Apache/2.2.10(Linux/SUSE)。Tomcat版本为6.0.18。以下是配置:

ProxyPass /ConnectionResetTestApp ajp://localhost:8009/ConnectionResetTestApp
将mod_proxy_http与以下配置一起使用会产生相同的中断行为:

ProxyPass /ConnectionResetTestApp http://localhost:8080/ConnectionResetTestApp
ProxyPassReverse /ConnectionResetTestApp http://localhost:8080/ConnectionResetTestApp
此示例应用程序可在以下位置进行测试:


关于为什么会发生这种情况,以及我们如何防止这种类型的错误,有什么想法吗?

答案已发布在评论中,因此我将只写下我为帮助您而遵循的流程

根据对问题的描述(当请求包含某些特定字符串时连接丢失),可能有几个原因:

  • 支柱
  • 雄猫
  • 阿帕奇
  • 操作系统
  • 您直接在tomcat上测试的事实意味着(几乎)Struts和tomcat不是原因,可能是tomcat AJP连接器,因此我对mod_proxy_http提出了问题。 然后,多亏了您的测试应用程序,我看到一个简单的请求甚至没有到达tomcat,它以同样的方式被拒绝(),所以tomcat退出了


    错误日志或访问日志中没有行这一事实意味着请求甚至没有到达apache,因此网络中以前有一些东西。由于apache是直接公开的,必须有一些防火墙规则阻止端口80上包含这些字符串的所有tcp包。

    发布您的apache配置。您是如何找到这些特定单词的?:)您是否碰巧使用了mod_security?mod_proxy_http是否工作得更好?您的环境中是否有Apache之前的版本?您是否使用所有这些产品的更新版本进行了测试?@AleksandrM非常痛苦…这是一种反复试验的情况。在一个应用程序中,我们收到了有关连接重置的投诉。然后我们开始重新测试我收到了更多的投诉,所以…我们向用户询问他们使用的输入。然后开始将输入一分为二,直到我们缩小了范围。在发现第一个案例后,我开始从互联网上随机抓取文本,直到我们缩小了范围。我肯定还有更多的关键字,但…我想我们现在就不谈了。@Brice From更多的测试,它似乎也发生在请求到达apache之前。有防火墙吗?有关于数据包被拒绝的系统日志吗?
    ProxyPass /ConnectionResetTestApp http://localhost:8080/ConnectionResetTestApp
    ProxyPassReverse /ConnectionResetTestApp http://localhost:8080/ConnectionResetTestApp