Tomcat请求特殊字符参数问题:Invalid character found in the request target. The valid characters are defined in

一、问题错误

最近遇到客户端说接口get请求,全部400错误,无法请求,刚开始以为是服务器对请求进行拦截了,但是访问主页面是正常的,也是get请求,那么可能就是tomcat的问题了,想到tomcat8的原因,会不会是请求参数的问题,后来url请求中包含 “{}[]” 特殊字符的都报错,是因为Tomcat在7.0.73, 8.0.39, 8.5.7版本后,在http解析时做了严格限制。

tomcat8正常访问:
在这里插入图片描述
后台报错原因:

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

在这里插入图片描述
前台报错:

http://192.168.2.25:8080/hg/check/list?data={"userid":"6"} 
Failed to load resource: the server responded with a status of 400 (Bad Request)

在这里插入图片描述

二、问题分析

在使用tomcat8中,我们可以看到错误:
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
也就是说我们的请求中包含无效的字符,由RFC规范可以得知,url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~四个特殊字符由于我们请求中包含 {} 字符串,所以tomcat报错。

三、问题解决

1、不使用特殊字符:使用其他的常用字符或数字,但是对于一些特定的参数,是需要进行传入特殊字符的——(不建议使用
2、对请求URL编码解码URLEncoder.encode(str,"UTF-8");、URLDecoder.decode(str,"UTF-8");,这种方法对于单一的请求还是可以的,或者在项目结构开始时,统一使用这种方式(可以使用
3、配置Tomcat对特殊字符的支持:统一配置tomcat配置文件,在所有Tomcat版本均适用。(推荐使用

我们在conf/catalina.properties中最后添加2行,(亲测有效

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

在这里插入图片描述

虽然Tomcat做了限制的同时,也提供了相关配置。给出的解决方案第一行requestTargetAllow,指定了允许的特殊字符,在等号后面配|{}就行了。

如果你只是需要使用这三个字符的话,使用上面的配置就可以使用了,重启tomcat,启动项目,就能正常使用了。

访问成功:
在这里插入图片描述
但是由于项目经常会传递数组类型的数据,或者其他特殊字符串类型,但是requestTargetAllow只能配置 |{} 允许这三个字符,如果想要使用除了|{} 这三个字符以外其他的(< > [ \ ] ^ ` { | } .)的字符串,我们需要以下配置:

conf/server.xml中的<Connector>节点中,添加2个属性:

relaxedPathChars="|{}[],"
relaxedQueryChars="|{}[],"

完整版:

 <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" 
	       	   URIEncoding="UTF-8"
               useBodyEncodingForURI="true"
			   relaxedPathChars="|{}[],"
	 		   relaxedQueryChars="|{}[],"
	/>

添加了这2个属性,重启tomcat后,访问项目时,我们就可以使用任意特殊字符,方便快捷,而且不需要大规模的进行改动。
以上就是Tomcat请求特殊字符参数问题的处理方法

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986是一个Java异常,它表示在请求目标中找到了无效字符。RFC 7230和RFC 3986定义了请求目标中允许的有效字符范围。这个异常通常出现在HTTP请求的处理过程中。 出现这个异常的原因可能是由于请求目标中包含了不符合RFC标准的无效字符。可能是由于URL编码错误、特殊字符未正确转义等原因导致的。通常情况下,这个异常会记录在日志中,以帮助开发者定位问题。 解决这个问题的方法是确保请求目标中的字符都是符合RFC 7230和RFC 3986定义的有效字符范围。可以使用URL编码对特殊字符进行正确转义,确保请求目标的格式符合标准。另外,还可以检查代码中处理请求目标的部分,确保没有对无效字符进行处理或解析。 综上所述,java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986是一个Java异常,表示在请求目标中找到了无效字符。要解决这个问题,需要确保请求目标中的字符符合RFC标准,并且检查代码中处理请求目标的部分,确保没有对无效字符进行处理或解析。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java.lang.IllegalArgumentException: Invalid character found in the request target 异常](https://blog.csdn.net/weixin_46417933/article/details/122409399)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [java.lang.IllegalArgumentException: Invalid character found in the request target. The valid charact](https://blog.csdn.net/ab601026460/article/details/85258829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牧小农

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值