我設立一個版本,我們的Web應用程序的運行Apache 2.4和Tomcat 7新機上,並不能獲得登錄工作的Tomcat/AJP在Apache 2.4(而不是2.2)。當前站點運行在Apache 2.2和Tomcat 6上。問題與POST參數與
調試顯示request.getParameter()
僅在2.4站點上返回null
。
我在所有的瀏覽器檢查這一點,導航網站的作品,所以AJP是至少部分功能 - 當我發帖的形式,表單數據是沒有看到我的Tomcat是隻。
配置是在兩個相同的:
<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,並且登錄也可以以這種方式正常工作。
的代碼是從同一個混帳回購協議和分支來了,所以一切應該是等同於傳統的網站。我應該看看Tomcat 7還是Apache 2.4的變化來跟蹤這個?
更新:我創建了一個非常簡單的test.jsp,並將表單設置爲發佈。我用...
Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String name = (String) paramNames.nextElement();
String[] values = request.getParameterValues(name);
..轉儲參數。通過直接URL 8080這個作品完美,但通過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,這有完全相同的問題。我的測試頁有一個日期戳記,所以它看起來不是緩存問題。
更新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的錯誤?
這甚至適用於微小的數據包 - 只有幾個字符的輸入文本的形式。它看起來像是Tomcat在通過AJP進入時不能正確處理表單數據 - 但是仍然可以通過request.getReader獲得字節。 –
出於性能考慮,希望將ProxyPass與AJP(通過HTTP)結合使用。 –