1.情景展示
tomcat 日志時不時會報出如下異常信息,到底是怎么回事?
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.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:283)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1017)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
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:745)
頁面無法打開
2.原因分析
意思是:請求頭中包含了 RFC 7230 and RFC 3986規(guī)范中定義的非法字符,在這種情況下就會導(dǎo)致頁面報400異常。
原因就是:tomcat的版本過高造成的,網(wǎng)上說,tomcat高于 7.0.73的版本,添加了對于http頭(請求頭)的驗證。
get請求,即問號傳參,就是只有請求頭,沒有請求體
RFC3986文檔規(guī)定,Url中只允許包含英文字母(a-zA-Z)、數(shù)字(0-9)、-_.~4個特殊字符以及所有保留字符。
RFC3986中指定了以下字符為保留字符:! * ' ( ) ; : @ & = + $ , / ? # [ ]
同時RFC 3986規(guī)范在tomcat7.0.73版本中就已經(jīng)提出了,RFC 7230也是對前者的一些補(bǔ)充或者說是完善,所以在tomcat7.0.73及以上版本都會有這種問題。
說明:這種情況,只在IE瀏覽器下會出現(xiàn),因為IE瀏覽器不會對中文參數(shù)進(jìn)行編碼,而其它類型的瀏覽器會默認(rèn)自動對中文進(jìn)行編碼。
3.解決方案
方法一:降低tomcat版本;
經(jīng)過測試發(fā)現(xiàn),網(wǎng)上關(guān)于tomcat的最高版本要求描述有誤,不是低于7.0.73就可以。
我下載了一個tomcat7.0.70,運行項目后,還是會字符集的錯誤,導(dǎo)致網(wǎng)頁無法打開。
但是,我測了tomcat7.0.61,完美正常運行項目,控制臺不再報錯,網(wǎng)頁可以正常打開了。
64位下載地址:https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.61/bin/apache-tomcat-7.0.61-windows-x64.zip
32位下載地址:https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.61/bin/apache-tomcat-7.0.61-windows-x86.zip
方法二:將get請求改為post請求;(推薦使用)
方法三:get請求(問號傳參)
使用URIEncoder()函數(shù),將中文進(jìn)行編碼
以上就是tomcat異常解決(Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986)的詳細(xì)內(nèi)容,更多關(guān)于tomcat 異常解決的資料請關(guān)注腳本之家其它相關(guān)文章!