Tomcat出現版本
- 7.0.69+
- 8.0.39+
- 8.5.7+
原因
- IE6-IE11(Edge 不存在,可能修改了編碼方案) 中文會被IE使用iso-8859-1編碼 編碼后的中文字符串帶反斜杠,這是RFC文檔中規定的不安全字符,Tomcat在高版本中增加的安全驗證,凡是RFC 3986中非URL可攜帶的字符,都會返回400錯誤
解決方案
- 前端對中文URLEncoding后在發送請求,后端要么修改tomcat源碼要么降低tomcat版本,否則無法解決這個bug,查閱資料后並沒有找到可以更改IE默認編碼的方法,后端在tomcat的server.xml中增加urlencoding配置也無法解決這個問題,因為這個問題根本都還沒有進入到業務層就已經被攔截返回了。所以,綜上,前端轉碼是最好的方案,因為Url參數中帶中文本來就是不符合規范的。
附 RFC 3986文檔關於特殊字符的定義
-
RFC3986文檔規定,Url中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字符以及所有保留字符。
-
RFC3986中指定了以下字符為保留字符:
! * ' ( ) ; : @ & = + $ , / ? # [ ] -
以下為不安全字符
- 空格 Url在傳輸的過程,或者用戶在排版的過程,或者文本處理程序在處理Url的過程,都有可能引入無關緊要的空格,或者將那些有意義的空格給去掉
- 引號以及<> 引號和尖括號通常用於在普通文本中起到分隔Url的作用
-
通常用於表示書簽或者錨點
- % 百分號本身用作對不安全字符進行編碼時使用的特殊字符,因此本身需要編碼
- {}|^[]`~ 某一些網關或者傳輸代理會篡改這些字符