前言
網(wǎng)上有很多關于tomcat版本過高導致的協(xié)議問題的解決方式,但是jar版本(例如spring boot內置的)的很少,特此總結了一下,如果只想看spring boot的解決方式,跳到最后一行
RFC 3986規(guī)范
1.RFC 3986文檔規(guī)定阳谍,Url中只允許包含英文字母(a-z,A-Z)、數(shù)字(0-9)杨帽、- _ . ~ 4個特殊字符以及所有保留字符萝风。
2.RFC3986中指定了以下字符為保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ]
不安全字符
還有一些字符才避,當他們直接放在Url中的時候喷楣,可能會引起解析程序的歧義汰聋。這些字符被視為不安全字符无埃,原因有很多徙瓶。
空格,Url在傳輸?shù)倪^程嫉称,或者用戶在排版的過程侦镇,或者文本處理程序在處理Url的過程,都有可能引入無關緊要的空格织阅,或者將那些有意義的空格給去掉
<>引號和尖括號通常用于在普通文本中起到分隔Url的作用
# 通常用于表示書簽或者錨點
% 百分號本身用作對不安全字符進行編碼時使用的特殊字符壳繁,因此本身需要編碼
{ } | \ ^ [ ]` ~ 某一些網(wǎng)關或者傳輸代理會篡改這些字符
解決方式
轉義
將請求值URL編碼(但是spring boot默認只會URL解碼一次,二次解碼需要另行添加)
更換版本
更換Tomcat為較低版本(提示:同樣的問題也存在于 >=8.0.39和>=9.0.0.M12)
使用POST
使用POST提交數(shù)據(jù)內容(body中)
修改配置
1.tomcat解壓版/安裝版
1.~/conf/catalina.properties中,找到最后注釋掉的一行 #tomcat.util.http.parser.HttpParser.requestTargetAllow選項,改成tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}荔棉,選項是按照字符分隔為一個數(shù)組,表示放行["|","{","}"]
2.或者你可以在~/conf/catalina.properties最后一行添加org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
2.內置版(spring boot等內置的tomcat)
在啟動時加入tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
實例:# java -jar -Dtomcat.util.http.parser.HttpParser.requestTargetAllow=|{} demo-0.0.1-SNAPSHOT.jar