天天看點

tomcat 參數無法傳遞問題

最近在做java web項目時,使用post方式送出form表單,背景無論如何都無法接受到參數。下面是對錯誤的描述:

下面是項目檔案目錄結構:

tomcat 參數無法傳遞問題

在login.jsp中表單見下圖:

tomcat 參數無法傳遞問題

       使用該表單向背景送出資料時,無論如何背景都收不到表單項值,使用tomcat版本是7.0.54。

不知道高手看到這裡,能不能找出問題的原理?

       百度各種搜尋資料,也沒有遇到相似的問題。後來,我們使用tomcat8版本重新部署該項目,發現沒有出現該問題,說明背景能夠收到表單的内容。到這裡,雖然問題解決了,但是問題出現的根本原理并沒有找到,作為一個技術研究者,總是希望探索問題根本緣由。

      首先第一步,我對tomcat7.0.54版本以上tomcat8以下的所有的tomcat進行了測試,發現從tomcat7.0.67版本開始,該問題不存在,7.0.67以前的版本都存在該問題。

      然後使用存在該問題的tomcat7.0.65(7.0.66版本官網沒有)重新釋出該項目,重新送出表單,然後使用google浏覽器的network,檢視請求和響應資訊,見下圖:

tomcat 參數無法傳遞問題

 請求狀态是302,說明請求被重定向了。怪不得背景收不到表單的值,重定向後,第一次請求的request内容無法轉到下一個請求中。為什麼會出現重定向呢?

 到這一步,我還沒有找到問題産生的根本原因,怎麼辦呢?就想去既然換了tomcat版本問題能夠解決,就去tomcat官網檢視,tomcat7.0.65以上的版本到底改變了哪些内容。雖然,tomcat7.0.66沒有提供下載下傳的版本,但是在changelog中卻有相應的記錄(tomcat7.0.66改變内容都展現在了7.0.67版本中),檢視tomcat7.0.66和tomcat7.0.67版本的的changelog,發現有一個更新改變,見下圖:

tomcat 參數無法傳遞問題

 由于英語水準有限,剛開始并不能完全了解紅框内的意思,但是裡面有幾個關鍵詞,defaultservlet、redirect等。而且,defaultservlet一般用作對靜态資源的攔截處理,在項目中也正是如此,看上面的項目目錄結構,發現有一個login檔案夾,該檔案夾中存放是js、css等靜态檔案。Login.jsp中表單送出的路徑與login檔案夾的請求路徑是相同的!!!它們都是http://xxxx/login。到這裡問題的原因已經找到了,看上面的紅框内的一句:this enables such requests to be processed by any cifnigured valvesand filters before the redirect is made.也就是說,tomcat把login請求當成了靜态資源請求交給了defaultservlet處理,由于login隻是一個路徑,并不是真正是資源檔案,是以,在tomcat7.0.66以前的版本中,若找不到資源檔案,就會把請求重定向,重定向後request中的内容肯定不會存在了,是以背景就接收不到form表單的内容;而在tomcat7.0.67及以後的版本中,defaultservlet把該請求當成一般的上下文請求,在重定向之前進行處理,是以,不會出現背景接收不到資料的現象。按照這個思路,我把login檔案夾改成了其它的名稱,問題果然得到了解決。

以上都是個人的了解,但是本人并沒有分析過tomcat源碼,是以對tomcat處理請求的原理,若有不對,希望各位給予改正。