異常信息
java.lang.IllegalArgumentException: 在請求目標中找到無效字符[/order/show?orderType=01&orderTitle=0xe50x8f0xa30xe50xb20xb80xe50x8a0xa80xe60x800x81&pageNum=1 ]。有效字符在RFC 7230和RFC 3986中定義org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:497)org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:492)org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:934)org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1698)org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)java.lang.Thread.run(Thread.java:748)
異常分析
這個錯誤通常出現在Tomcat服務器處理HTTP請求時,當請求URL或參數中包含不符合RFC 7230和RFC 3986規范的字符時拋出。主要問題原因有:
1、請求中包含未編碼的中文字符
2、URL參數包含特殊符號(如[]{}等)
3、高版本Tomcat(8.5+)對URL字符校驗更嚴格
本次異常就是因為URL中的orderTitle參數包含未編碼的中文字符導致的。
解決辦法
方案1
1、在tomcat安裝路徑中conf/catalina.properties文件中最后添加如下一行:
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}[],%
tomcat.util.http.parser.HttpParser.requestTargetAllow 是Tomcat高版本(8.5+)中用于放寬HTTP請求目標字符限制的關鍵配置參數,主要作用是允許特定特殊字符通過校驗和解決Invalid character found in request target錯誤。默認情況下,Tomcat會嚴格遵循RFC 7230和RFC 3986規范,拒絕包含{}[]|\
等特殊字符的請求。通過該參數可顯式聲明允許的字符集。
有的博客還建議加上org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true配置配合使用,該配置用于控制URL編碼斜杠處理行為的關鍵系統屬性。當設置為true時,Tomcat會允許URL中包含%2F(/的編碼形式)和%5C(\的編碼形式)的請求通過校驗,默認情況下Tomcat會拒絕此類請求并返回400錯誤。而%2F容易導致安全性問題,所以建議保持默認不要開啟。
2、在tomcat安裝路徑中conf/server.xml中的Connector節點中添加relaxedPathChars屬性和relaxedQueryChars屬性放寬URL字符校驗:
<Connector relaxedPathChars="|{}[],%" relaxedQueryChars="|{}[],%"URIEncoding="UTF-8"/>
添加的2個屬性用來接收任意特殊字符的組合,特殊符號包括但不限于:|{}[],%等。
relaxedPathChars?用于指定URL路徑部分(/path/to/resource)允許的特殊字符集,默認僅支持RFC規范的安全字符。通過配置可允許{}[]|等符號出現在路徑中。
relaxedQueryChars?用于控制查詢字符串(?key=value&…)中的合法字符范圍,常用于處理JSON參數或含特殊符號的GET請求。
注意:過度放寬字符限制可能引發安全攻擊,建議僅對必要字符放行。
方案2
1、對URL中的中文參數進行編碼后再傳參。編碼String encodedOrderTitle = URLEncoder.encode(orderTitle, “UTF-8”);解碼java.net.URLDecoder.decode(encodedOrderTitle,“UTF-8”);
2、在tomcat安裝路徑中conf/server.xml中的Connector節點中增加URIEncoding=“UTF-8”。強制Tomcat在處理GET請求的URL參數(路徑和查詢字符串)時使用UTF-8解碼,解決中文等非ASCII字符的亂碼問題。