在Apache 2.4上使用Tomcat / AJP的POST参数问题(但不是2.2)

时间:2017-05-24 20:26:00

标签: apache tomcat7 apache2.4 ajp

我正在运行Apache 2.4和Tomcat 7的新机器上设置我们的webapp版本,并且无法使登录工作。当前站点在Apache 2.2和Tomcat 6上运行。

调试显示request.getParameter()仅在2.4网站上返回null

我已经在所有浏览器中检查了这一点,并且浏览网站是有效的,因此AJP至少部分功能正常 - 只有当我发布表单时才会看到我的Tomcat没有看到表单数据。 / p>

两者的配置相同:

<VirtualHost *:80>
  ServerName      www.example.com
  ServerAlias      example.com
  ServerAlias      cdn.example.com
  ServerAlias      prod.example.com

  ProxyPreserveHost On
  ProxyPass /images/ !
  ProxyPass /font/ !
  ProxyPass /style/ !
  ProxyPass / ajp://localhost:8009/ retry=1 acquire=3000 timeout=600 Keepalive=On
  ProxyPassReverse / ajp://localhost:8009/

并且server.xml中定义的连接器为:

<Connector port="8009" address="localhost"
           maxThreads="250" minSpareThreads="5" maxSpareThreads="15"
           connectionTimeout="200000"
           packetSize="16384"
           maxHttpHeaderSize="16384"
           enableLookups="false" redirectPort="8443"
           emptySessionPath="true" URIEncoding="UTF-8" protocol="AJP/1.3"/>

浏览器请求标题为:

Host: prod.example.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es,sv;q=0.9,de;q=0.8,en;q=0.6,es-MX;q=0.5,en-AU;q=0.4,ja;q=0.3,fr;q=0.1
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 73
Referer: http://prod.example.com/en_US/auth/login.action
Cookie: JSESSIONID=07FB9E1A02A4464C0D65B332B53EF02F
Connection: keep-alive
Upgrade-Insecure-Requests: 1

我通过端口8080启用了直接Tomcat访问,登录也正常。

代码来自同一个git repo和分支,因此其他所有内容都应与旧网站完全相同。我应该查看Tomcat 7还是Apache 2.4更改来跟踪这个?

更新:我创建了一个非常简单的test.jsp,其表单设置为post。我用......

Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
  String name = (String) paramNames.nextElement();
  String[] values = request.getParameterValues(name);

..转储参数。通过直接8080 URL,这可以很好地工作,但是通过Apache / AJP,所有POST参数都被忽略,但是如果我手动将GET参数添加到URL,例如。 ?test=123这些工作正常。

更新2 :我将request.getReader()的输出添加到我的test.jsp,我的POST数据在那里正确显示,例如t1=Some+text&t2=Testingrequest.getParameter("t1")仍为null。我一定错过了一些非常愚蠢的东西。

更新3 :我原本以为这是与SSL相关的,但现在已经设置了非SSL VirtualHost,这有着完全相同的问题。我的测试页面有一个日期戳,所以它似乎不是一个缓存问题。

Update 4 :我刚刚进行了以下更改,允许正确处理表单POST数据:

# ProxyPass / ajp://localhost:8009/ retry=1 acquire=3000 timeout=600 Keepalive=On
# ProxyPassReverse / ajp://localhost:8009/
ProxyPass / http://localhost:8080/ retry=1 acquire=3000 timeout=600 Keepalive=On
ProxyPassReverse / http://localhost:8080/

那么,这看起来像是Apache还是Tomcat?

1 个答案:

答案 0 :(得分:1)

您的POST邮件中有多少项? Tomcat具有最大数量。默认情况下,Tomcat 7非常高,10,000。虽然有几个参数,但AJP似乎不是可配置的。请参阅以下内容:

https://tomcat.apache.org/tomcat-7.0-doc/config/ajp.html

关于你的问题,本文似乎在经过详尽的测试后建议它是AJP(尽管作者的结论是它是tomcat):http://tomcat.10.x6.nabble.com/Tomcat-looses-POST-parameters-td2067515.html。实质上,数据进入了AJP而没有出现在Tomcat的第一个过滤器中。

你没有使用HTTP的ProxyPass的原因吗?