2017-05-24 84 views
0

我設立一個版本,我們的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=Testingrequest.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的錯誤?

回答

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?

+0

這甚至適用於微小的數據包 - 只有幾個字符的輸入文本的形式。它看起來像是Tomcat在通過AJP進入時不能正確處理表單數據 - 但是仍然可以通過request.getReader獲得字節。 –

+0

出於性能考慮,希望將ProxyPass與AJP(通過HTTP)結合使用。 –