我正在运行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=Testing
但request.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?
答案 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的原因吗?