背景
在將tomcat升級到7.0.81版后,發現系統的有些功能不能使用了,查詢日志發現是有些地址直接被tomcat認為存在不合法字符,返回HTTP 400錯誤響應,錯入信息如下:
原因分析
經了解,這個問題是高版本tomcat中的新特性:就是嚴格按照 RFC 3986規范進行訪問解析,而 RFC 3986規范定義了Url中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字符以及所有保留字符(RFC3986中指定了以下字符為保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。而我們的系統在通過地址傳參時,在url中傳了一段json,傳入的參數中有"{"不在RFC3986中的保留字段中,所以會報這個錯。
根據(https://bz.apache.org/bugzilla/show_bug.cgi?id=60594) ,從以下版本開始,有配置項能夠關閉/配置這個行為:
8.5.x系列的:8.5.12 onwards
8.0.x系列的:8.0.42 onwards
7.0.x系列的:7.0.76 onwards
處理方法
.../conf/catalina.properties中,找到最后注釋掉的一行 #tomcat.util.http.parser.HttpParser.requestTargetAllow=| ,改成tomcat.util.http.parser.HttpParser.requestTargetAllow=|{},表示把{}放行
------2018.01.30 新增--------
按照上面的方法處理好后,在非IE瀏覽器上訪問,是沒有問題了。但若是在IE瀏覽器上進行訪問,這個錯誤還是會出現,在IE上訪問出現這個錯誤的原因:因為url的參數json中有雙引號,火狐和谷歌瀏覽器會自動對url進行轉碼,但IE不會
這種情況的處理方法:
給系統配置方向代理服務器,通過反向代理服務器進行urlrewrite,手動取出各個json的數據,手動將雙引號進行轉碼為%22:
具體方式如下:
編輯 Apache安裝目錄/conf/httpd.conf, 在配置項目反向代理的前面添加如下信息:
RewriteCond %{QUERY_STRING} json
RewriteCond %{QUERY_STRING} !msKey
RewriteCond %{QUERY_STRING} msInfo
RewriteCond %{QUERY_STRING} player
RewriteCond %{QUERY_STRING} {[a-zA-Z0-9]*([a-zA-Z]+)[a-zA-Z0-9]:[a-zA-Z0-9]*([a-zA-Z0-9*]+)[a-zA-Z0-9],[a-zA-Z0-9]*([a-zA-Z]+)[a-zA-Z0-9]:[a-zA-Z0-9]*([a-zA-Z0-9*]+)[a-zA-Z0-9]}
RewriteRule ^(.*)? $1?method=sendJson&json={%22%1%22:%22%2%22,%22%3%22:%22%4%22} [R,L,NE]
參考
https://tomcat.apache.org/tomcat-7.0-doc/config/systemprops.html(官網各配置項說明)