tomcat 參數無法傳遞問題

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

下面是項目文件目錄結構:


在login.jsp中表單見下圖:



       使用該表單向後臺提交數據時,無論如何後臺都收不到表單項值,使用tomcat版本是7.0.54。

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

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

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

      然後使用存在該問題的tomcat7.0.65(7.0.66版本官網沒有)重新發布該項目,重新提交表單,然後使用google瀏覽器的network,查看請求和響應信息,見下圖:


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

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


 由於英語水平有限,剛開始並不能完全理解紅框內的意思,但是裏面有幾個關鍵詞,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處理請求的原理,若有不對,希望各位給予改正。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章