欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决Invalid character found in the request target. The valid characters are defined in RFC 7230 and ..

程序员文章站 2022-06-01 15:01:47
...

最近在维护一个老项目, 测试接口的时候遇到了一个问题

环境:

  •     tomcat 7.0.75,
  •     JDK 1.6 ,
  •     OS  win 10
信息: 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.InternalAprInputBuffer.parseRequestLine(InternalAprInputBuffer.java:235)
	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.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2536)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2525)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:662)

具体的日志 大概就是这样子;

首先分析日志:

  1. 请求返回的状态码为 400 bad request;
  2. org.apache.coyote.http11.InternalAprInputBuffer.parseRequestLine(InternalAprInputBuffer.java:235) 由此可以看出 是tomcat 连接器coyote也就是主要做网络底层处理的组件报错了
    1. 由此推断是网络请求解析异常;

最终解决方案: 升级tomcat版本添加配置:  
     在conf/server.xml中的<Connector>节点中,添加2个属性:  relaxedPathChars="|{}[]%^" relaxedQueryChars="|{}[]%^";

解决的历程:

最开始我就是百度: 果然是因为网络地址中有非法字段造成的; 给出的解决方案 :
1. 在 tomcat  /catalina.properties配置文件中新增两项配置:

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

很遗憾没有解决问题: 

2. 第二种方案降低 tomcat 版本.

百度上 第一种方案大部分人都实践有效; 为什么我的无效; 然后我就去tomcat 官网查看了相关的资料;
首先查看两种配置的作用: 
第一项 : tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}    这个配置只针对 | , { , } 这三个字符生效; 也就是说你的请求路径中如果传递了一个json字符串,里面包含了一些其他字符串是不生效的
好在官网给出了推荐配置: Use the relaxedPathChars and relaxedQueryChars attributes of the Connector instead.  
 在conf/server.xml中的<Connector>节点中,添加2个属性:

解决Invalid character found in the request target. The valid characters are defined in RFC 7230 and ..

  relaxedPathChars="|{}[]%^" relaxedQueryChars="|{}[]%^"	
# 整体配置
  <Connector 		connectionTimeout="20000" 
					port="9090" 
					protocol="HTTP/1.1" 
					redirectPort="8443" 
					relaxedPathChars="|{}[]%^" relaxedQueryChars="|{}[]%^"				
					/>

但是 按照官网给出的配置依旧不生效, 然后我打开我的tomcat 说明文档: 发现我的tomcat居然没有  tomcat.util.http.parser.HttpParser.requestTargetAllow=|{} 这一项配置;

第二项配置:    org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true    这一项配置只针对 '%2F' 和 '%5C' ;

解决Invalid character found in the request target. The valid characters are defined in RFC 7230 and ..

没办法给出的解决方案 一项配置没有 一项配置达不到解决问题的目的;
只好查看tomcat 更新的日志了: 

解决Invalid character found in the request target. The valid characters are defined in RFC 7230 and ..

解决Invalid character found in the request target. The valid characters are defined in RFC 7230 and ..

 

查看日志发现   tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}    这一项配置在 tomcat 7.0.76 才有 所以我配置不生效; 至于官网推荐的在Connector   添加配置则是更加后面的版本才新增的;
最坑爹的是 关于请求路径中非法字符的校验,实在tomcat 7.0.73版本才加的, 而我的刚好在73 和 76 之间 是75版本;
没办法, 只好更换tomcat 版本
最终我采用了 升级tomcat版本;  在conf/server.xml中的<Connector>节点中,添加2个属性:  relaxedPathChars="|{}[]%^" relaxedQueryChars="|{}[]%^";

当然大家对于 tomcat 7.0.73-7.0.75 版本之间有其他的解决方式 也欢迎大家留言告知!