请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

Tomcat7.0.77 版本出现 The valid characters are defined in RFC 7230 and RFC 3986问题

老师您好,在执行:curl http://localhost:8081/sys/dept/save.json\?name\=技术部\&seq\=1\&remark\=技术部
报错如下:

INFO: Error parsing HTTP request header

 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.

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:1028)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)

at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.lang.Thread.run(Thread.java:748)

经查,是由于在tomcat 7.0.73添加对http请求url的规范限制,不允许使用包含未编码的花括号的url进行请求。
网上查找了解决办法:可以修改tomcat 配置文件 catalina.properties
1. tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

2. org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

重启后问题仍然存在,URLEncode编码又不会,主要是找不到在哪儿

请问一下,您的环境使用的tomcat版本,我直接保持一致,谢谢。

正在回答

插入代码

3回答

你好,我本地的tomcat版本和你很相似,由于其他学员也遇到过类似的问题,他们基本上都是代码细节上写的有点问题,我建议你可以在这里把出问题的请求的前后端代码截屏发一下,或者在qq群里找我发下代码让我看看。

1 回复 有任何疑惑可以回复我~
  • 提问者 TenWords #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2017-12-09 09:33:01
Geely 2017-12-18 00:39:58

赞赞赞

1 回复 有任何疑惑可以回复我~
提问者 TenWords 2017-12-09 10:06:41

谢谢老师,如果是代码问题,我再自己核一遍代码。顺便把问题现象贴出来,方便后续的同学学习参考。

我的现象是这样的,如果使用控制台命令行,把中文换成英文是可以成功请求的,并且写入数据库正常。但是URL请求中有中文字符,前端控制台无返回,控制台设置中英文UTF-8字符集都尝试过,还是一样的情况,我打断点看过,curl调用后,压根没有进入程序,访问请求的时候,就直接抛异常了。我以为是tomcat的问题。
https://img1.sycdn.imooc.com//szimg/5a2b44db0001c60e10580290.jpg

URL中使用中文字符,访问控制台无返回值,后台抛异常:

https://img1.sycdn.imooc.com//szimg/5a2b406900015fda07740172.jpg

https://img1.sycdn.imooc.com//szimg/5a2b406900014fc310100233.jpg
URL中使用英文字符,访问请求前后台都正常:

https://img1.sycdn.imooc.com//szimg/5a2b43cc0001898f09480208.jpg

https://img1.sycdn.imooc.com//szimg/5a2b43cc0001dba108410107.jpg

用chrome浏览器访问,中英文都可以,但是使用中文的插入数据库后是乱码。前端返回正常,如图:

https://img1.sycdn.imooc.com//szimg/5a2b3eb10001c25c05790205.jpg
https://img1.sycdn.imooc.com//szimg/5a2b3ed80001f18c07650133.jpg

###代码截图###:

https://img1.sycdn.imooc.com//szimg/5a2b41c20001822810470185.jpg

https://img1.sycdn.imooc.com//szimg/5a2b41c20001cce611640702.jpg


1 回复 有任何疑惑可以回复我~
  • Jimin #1
    你好,你这问题说明的太赞了,特别详细,我认真的看了你的截图,你的代码是没问题的,是url请求到服务器端接收时出问题了。这个可以尝试终端设置编码为utf-8。
    
    实际上http的响应可以分成数据获取和数据解释两个步骤,首先在数据获取这个步骤中,浏览器、telnet、curl是没有区别的,都是和web程序先建立tcp连接,然后获取web程序返回的数据。不同的是在数据解释这个步骤中,浏览器是符合http规范的,http规范中说响应头Content-Type中的charset指定的编码,就是响应内容的实际编码,用telnet、curl演示的例子只是负责获取数据这一个步骤,对于数据解释这个步骤是有发起命令的终端来负责的,而终端跟http协议没有关系,终端只会只用预先设定的编码规则来显示内容。
    
    同时,为了尽可能避免乱码,tomcat可以尝试在server.xml做如下配置:
    <Connectorport="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                    redirectPort="8443"URIEncoding="utf-8"/>
    
    tomcat会使用URIEncoding指定的编码对URI部分进行百分解码,如果没有指定则使用ISO-8859-1对其进行解码
    
    希望能帮助到你~
    回复 有任何疑惑可以回复我~ 2017-12-09 11:05:38
  • 提问者 TenWords 回复 Jimin #2
    非常感谢老师做如此详细的解答,真正学到了知其然知其所以然,确实是我疏忽了,tomcat未指定URIEncoding="utf-8",目前可以通过浏览器提交请求,数据插入正常,未出现乱码。
    回复 有任何疑惑可以回复我~ 2017-12-10 00:46:57
  • loubobooo 回复 Jimin #3
    其实我也想到了是tomcat里的server.xml的uri编码问题,给老师解析问题的思路点赞
    回复 有任何疑惑可以回复我~ 2017-12-18 14:54:28
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号