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

当请求头包含RFC 7230和RFC 3986中未定义的字符时,Tomcat会抛出400错误。从7.0.88版起,Tomcat加强安全限制,不允许URL查询字符串使用原始方括号。解决方法包括修改Tomcat配置文件server.xml添加relaxedQueryChars属性,降级Tomcat版本,或转换请求类型为POST。

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

在这里插入图片描述

2021-6-15 14:08:41 org.apache.coyote.http11.AbstractHttp11Processor process
信息: 解析 HTTP 请求 header 错误
 Note: further occurrences of HTTP request 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:206)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1108)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:654)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:317)
	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)

报错解释: 请求头中包含了 RFC 7230 and RFC 3986规范中定义的非法字符,在这种情况下就会导致页面报400异常。

问题:
Tomcat抛出异常,导致400 错误请求。

从7.0.88开始,大多数tomcat版本都会出现此问题。

Tomcat增强了其安全性,并且不再允许在查询字符串中使用原始方括号。在请求中,我们url中有特殊符号,因此服务器未处理该请求。

RFC3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。

RFC3986中指定了以下字符为保留字符:

! * ’ ( ) ; : @ & = + $  / ? # [ ]

URL中不能包含的特殊字符:

  • 键盘上那些控制键:(<32或者=127)
  • 非英文字符(>127)
  • 空格(32)
  • 双引号(34)
  • #(35)
  • <(60)
  • >(62)
  • 反斜杠\(92)
  • ^(94)
  • TAB上面那个键,~(96)
  • {(123)
  • }(124)
  • |(125)

解决方案(由Apache团队建议):

方法一:

在tomcat conf路径下的server.xml文件里面的 Connector 标签下添加属性 relaxedQueryChars:

<!-- 如果应用程序需要默认情况下tomcat不支持的更多特殊字符,请在relaxedQueryChars上述属性中添加这些特殊字符,并以逗号分隔。 -->
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               URIEncoding="utf-8"
               relaxedQueryChars="\,|"/>

在这里插入图片描述

方法二(不推荐):

降低tomcat版本。

方法三:

将get请求改为post请求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值