1.情景展示
tomcat 日志時(shí)不時(shí)會(huì)報(bào)出如下異常信息,到底是怎么回事?
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.原因分析
意思是:請(qǐng)求頭中包含了 RFC 7230 and RFC 3986規(guī)范中定義的非法字符,在這種情況下就會(huì)導(dǎo)致頁面報(bào)400異常。
原因就是:tomcat的版本過高造成的,網(wǎng)上說,tomcat高于 7.0.73的版本,添加了對(duì)于http頭(請(qǐng)求頭)的驗(yàn)證。
get請(qǐng)求,即問號(hào)傳參,就是只有請(qǐng)求頭,沒有請(qǐng)求體
RFC3986文檔規(guī)定,Url中只允許包含英文字母(a-zA-Z)、數(shù)字(0-9)、-_.~4個(gè)特殊字符以及所有保留字符。
RFC3986中指定了以下字符為保留字符:! * ' ( ) ; : @ & = + $ , / ? # [ ]
同時(shí)RFC 3986規(guī)范在tomcat7.0.73版本中就已經(jīng)提出了,RFC 7230也是對(duì)前者的一些補(bǔ)充或者說是完善,所以在tomcat7.0.73及以上版本都會(huì)有這種問題。
說明:這種情況,只在IE瀏覽器下會(huì)出現(xiàn),因?yàn)镮E瀏覽器不會(huì)對(duì)中文參數(shù)進(jìn)行編碼,而其它類型的瀏覽器會(huì)默認(rèn)自動(dòng)對(duì)中文進(jìn)行編碼。
3.解決方案
方法一:降低tomcat版本;
經(jīng)過測(cè)試發(fā)現(xiàn),網(wǎng)上關(guān)于tomcat的最高版本要求描述有誤,不是低于7.0.73就可以。
我下載了一個(gè)tomcat7.0.70,運(yùn)行項(xiàng)目后,還是會(huì)字符集的錯(cuò)誤,導(dǎo)致網(wǎng)頁無法打開。
但是,我測(cè)了tomcat7.0.61,完美正常運(yùn)行項(xiàng)目,控制臺(tái)不再報(bào)錯(cuò),網(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請(qǐng)求改為post請(qǐng)求;(推薦使用)
方法三:get請(qǐng)求(問號(hào)傳參)
使用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 異常解決的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!