Tomcat 8 Invalid character found in the request target. The valid characters are defined in RFC 3986

終極解決方案: Invalid character found in the request target. The valid characters are defined in RFC 3986
25-Aug-2018 11:27:27.086 信息 [http-nio-8087-exec-5] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
 java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:479)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

從錯誤日志中看到Error parsing HTTP request header
負(fù)責(zé)解析http請求的是org.apache.tomcat.util.http.parser.HttpParser媒佣,它對請求對URL中對字符做了限制蒿秦,具體代碼如下:
IS_NOT_REQUEST_TARGET[]中定義了一堆not request target

if(IS_CONTROL[i] || i > 127 || i == 32 || i == 34 || i == 35 || i == 60 || i == 62 || i == 92 || i == 94 || i == 96 || i == 123 || i == 124 || i == 125) {
                IS_NOT_REQUEST_TARGET[i] = true;
            }

轉(zhuǎn)換過來就是以下字符(對應(yīng)10進制ASCII),也就是URL中不能包含的特殊字符:

  • 鍵盤上那些控制鍵:(<32或者=127)
  • 非英文字符(>127)
  • 空格(32)
  • 雙引號(34)
  • #(35)
  • <(60)
  • >(62)
  • 反斜杠(92)
  • ^(94)
  • TAB上面那個鍵,~(96)
  • {(123)
  • }(124)
  • |(125)



我碰到這個問題也搗弄了半天朗恳,參照其他的各種解決方案都不行涧窒。并且我是使用了多種特殊字符肌似,運用單一某種方案還不能完全奏效棵里。下面是經(jīng)過實踐的解決方案义黎,請按順序讀完禾进。

解決辦法(親測)

在conf/catalina.properties中最后添加2行:

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

該方式,在所有Tomcat版本均適用廉涕。

解析:在執(zhí)行請求時泻云,碰到該沒問題的,大多是在URL中傳輸Json等火的。尤其是用瀏覽器地址輸入的URL死活不能包含有任何特殊字符壶愤。否則會返回400 狀態(tài)碼。

首先:不推薦降低tomcat版本馏鹤,這等于掩耳盜鈴征椒,絕對得不償失。
Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后湃累,在http解析時做了嚴(yán)格限制勃救。
RFC3986文檔規(guī)定,請求的Url中只允許包含英文字母(a-zA-Z)治力、數(shù)字(0-9)蒙秒、-_.~4個特殊字符以及所有保留字符。

如果要使用這些特殊字符宵统,并不是絕對不可以晕讲。Tomcat做了限制的同時,也提供了相關(guān)配置马澈。給出的解決方案第一行requestTargetAllow瓢省,指定了允許的特殊字符,在等號后面配|{}就行了痊班。

如果你需要使用這三個字符勤婚,配置到此就OK了。重啟tomcat涤伐,rebuild工程再啟動馒胆,就能正常使用了缨称。

不幸的是, requestTargetAllow 只能配置|祝迂、{睦尽、} 允許這三個字符,對于其他的(例如" < > [ \ ] ^ ` { | } .)液兽,在請求時骂删,仍然攔截,如果使用了|{}之外的其他字符那怎么辦呢四啰?那就還需要如下配置宁玫。

在conf/server.xml中的<Connector>節(jié)點中,添加2個屬性:
relaxedPathChars="|{}[],"
relaxedQueryChars="|{}[],"

這2個屬性柑晒,可以接收任意特殊字符的組合欧瘪,根據(jù)需要可以自行增減。
與此相關(guān)的文檔說明:


文檔地址:https://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.html



文檔地址:https://tomcat.apache.org/tomcat-8.5-doc/config/http.html


文檔地址:http://tomcat.apache.org/tomcat-7.0-doc/changelog.html




另一種方式匙赞,就是發(fā)請求前佛掖,進行URLEncoder.encode(requestURI,"UTF-8");此方法適用于 執(zhí)行發(fā)出請求的是ajax或其他客戶端程序(可以發(fā)出http請求的編程語言,都有encode()相關(guān)支持)涌庭。

然后在后臺接收請求后decode()
String params = request.getParameter(PARAMS);
params = URLDecoder.decode(params,"UTF-8");

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芥被,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子坐榆,更是在濱河造成了極大的恐慌拴魄,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件席镀,死亡現(xiàn)場離奇詭異匹中,居然都是意外死亡,警方通過查閱死者的電腦和手機豪诲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門顶捷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屎篱,你說我怎么就攤上這事服赎。” “怎么了交播?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵专肪,是天一觀的道長。 經(jīng)常有香客問我堪侯,道長,這世上最難降的妖魔是什么荔仁? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任伍宦,我火速辦了婚禮芽死,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘次洼。我一直安慰自己关贵,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布卖毁。 她就那樣靜靜地躺著揖曾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亥啦。 梳的紋絲不亂的頭發(fā)上炭剪,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音翔脱,去河邊找鬼奴拦。 笑死,一個胖子當(dāng)著我的面吹牛届吁,可吹牛的內(nèi)容都是我干的错妖。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼疚沐,長吁一口氣:“原來是場噩夢啊……” “哼暂氯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亮蛔,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤痴施,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后尔邓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晾剖,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年梯嗽,在試婚紗的時候發(fā)現(xiàn)自己被綠了齿尽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡灯节,死狀恐怖循头,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炎疆,我是刑警寧澤卡骂,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站形入,受9級特大地震影響全跨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亿遂,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一浓若、第九天 我趴在偏房一處隱蔽的房頂上張望渺杉。 院中可真熱鬧,春花似錦挪钓、人聲如沸是越。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倚评。三九已至,卻和暖如春馏予,著一層夾襖步出監(jiān)牢的瞬間天梧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工吗蚌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腿倚,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓蚯妇,卻偏偏與公主長得像敷燎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子箩言,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351