问题描述
开发中,遇到这么一个问题,前端使用get方式请求SpringMVC的后台控制层方法,但是直接没有进方法断点,就报错了
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:467)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:667)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:789)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
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:745)
问题分析
Tomcat在 7.0.73、8.0.39、8.5.7 版本后,添加了对于http头的验证,具体来说,就是添加了些规则去限制HTTP头的规范性
解决方法
将对相应的参数进行编码,我测试了一下,中文的添加就可以的,数字不用添加编码转换
var param = '?title=' + encodeURI(obj.field.title)
+ '&newsType=' + obj.field.newsType
+ '&newsTime=' + encodeURI(obj.field.newsTime)
+ '&sort=' + obj.field.sort
+ '&orgId=${sessionScope.userInfoSession.orgId}'
+ '&createUser=${sessionScope.userInfoSession.id}';
window.open('<%=path%>/newsInfo/saveNoticeOffice.action' + param);
网上还有其他办法,例如修改Tomcat配置、更换Tomcat、或者修改请求方法都能解决这个问题,但是我采用了参数编码的方式,实际项目中,怎么可能tomcat说换就换,害!