做項目的時候碰到一個問題,就是Tomcat在處理含有|,{,}的字符的Url時候,發現請求沒有到達指定的Controller上面,而在Access_log中寫入了get null null 400的錯誤信息,從網上也翻了幾個資料最終確定是tomcat的一個問題(個人覺得也是一個缺陷)
問題的由來
Tomcat根據rfc的規范Url中不能有類似|,{,}等不安全字符串,但在實際的操作中有時為了數據完整性和加密的方式都需要有|,{,}出現,這樣的話Tomcat會直接告訴客戶端Bad Request.
對于這個問題,很多人也提出很多不同的看法:https://bz.Apache.org/bugzilla/show_bug.cgi?id=60594,經過修改,最終Tomcat把權限開放出來,通過tomcat.util.http.parser.HttpParser. requestTargetAllow這個配置選項,允許不安全字符的出現。Tomcat詳細配置
解決方法
經過幾次探索,有以下幾個方法能夠解決這個問題:
- 把請求的Url進行編碼,這個對源頭進行處理,來規避這個問題,如果是第三方來調用的url就無能無力。
- 修改Tomcat的配置文件(Tomcatconfcatalina.properties),適用tomcat 7以上的版本
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
3.使用其它服務器進行中轉,比如IIS和Apache
(本文完)