項目用的spring +spring mvc + mybatis框架,關於統一錯誤頁面在開發的過程中就做過編碼,並且一直都很有效,像500,404,403等常規錯誤碼都能得到有效處理,
但是400卻不行,而且還暴露tomcat的版本信息,這是很嚴重的安全漏洞.
嘗試各種方式都不行,后來終於發現是tomcat的版本問題,好像是tomcat7.9以上的版本,都不支持請求鏈接上帶有特殊字符.否則會報400錯誤,
tomcat請求中包含特殊字符 [] | {} 發送get請求失敗:
原因:
這是因為Tomcat嚴格按照 RFC 3986規范進行訪問解析,而 RFC 3986規范定義了Url中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字符以及所有保留字符(RFC3986中指定了以下字符為保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。傳入的參數中有"{"不在RFC3986中的保留字段中,所以會報這個錯。
400錯誤的解決方式:
方法一 : 降低tomcat的版本
方法二: 修改server.xml
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" relaxedQueryChars="[]|{}^\`"<>" redirectPort="8443" />