問題:將皕杰報(bào)表demoserver中的演示項(xiàng)目report部署到tomcat8最新版本后尤慰,web端訪問報(bào)表報(bào)錯(cuò):
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.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:189)
? at? org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1000)
? at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
? at? org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
? at? java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
? at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
? at? org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
? at java.lang.Thread.run(Thread.java:745)
請(qǐng)求鏈接的格式:http://localhost:8080/report/ReportEmitter?rpt=Demo/分組報(bào)表/1普通分組.brt
以前的Tomcat版本不會(huì)出現(xiàn)這問題眶诈,經(jīng)排查發(fā)現(xiàn)距误,原來(lái)最新的tomcat新版本增加了一個(gè)新特性鸽凶,就是嚴(yán)格按照 RFC
3986規(guī)范進(jìn)行訪問解析耗跛,而 RFC 3986規(guī)范定義了Url中只允許包含英文字母(a-zA-Z)芍锦、數(shù)字(0-9)励饵、-_.~4個(gè)特殊字符以及所有保留字符(RFC3986中指定了以下字符為保留字符:!
* ’ ( ) ; : @ & = + $ , / ? # [ ])。
由于請(qǐng)求中包含了中文字符恐锦,所以tomcat無(wú)法正確解析請(qǐng)求參數(shù)往果,導(dǎo)致出錯(cuò)。
解決方案:
1.降低tomcat的版本一铅。
2.采用最新tomcat版本陕贮。對(duì)請(qǐng)求鏈接進(jìn)行編碼,report項(xiàng)目中所有編碼格式都改成utf-8;對(duì)訪問皕杰報(bào)表的鏈接進(jìn)行轉(zhuǎn)碼處理潘飘。