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

简介: 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正常访问:

屏幕快照 2022-05-10 下午1.39.41.png

后台报错原因:

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

屏幕快照 2022-05-10 下午1.40.13.png

二、问题分析

在使用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

屏幕快照 2022-05-10 下午1.41.34.png

虽然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请求特殊字符参数问题的处理方法


目录
相关文章
|
5月前
|
应用服务中间件
从零手写实现 tomcat-03-请求和响应的抽象
该文档介绍了 MiniCat 项目,它是一个简单的 HTTP 服务器实现。v1 版本中, MiniCatRequest 对象解析 HTTP 请求,包括方法、URL 和输入流,而 MiniCatResponse 使用输出流处理响应。start 方法使用这些封装后的对象处理网络通信。在 v2 版本,服务器添加了返回静态资源文件的功能,如 HTML,通过解析 URL 并读取对应本地文件内容来响应请求。测试示例展示了如何访问和显示 index.html。
|
10月前
|
JSON 前端开发 Java
图解HTTP请求Tomcat服务器实现前后端交互-2
图解HTTP请求Tomcat服务器实现前后端交互
90 0
|
10月前
|
前端开发 JavaScript Java
图解HTTP请求Tomcat服务器实现前后端交互-1
图解HTTP请求Tomcat服务器实现前后端交互
177 0
|
15天前
|
监控 网络协议 应用服务中间件
【Tomcat源码分析】从零开始理解 HTTP 请求处理 (第一篇)
本文详细解析了Tomcat架构中复杂的`Connector`组件。作为客户端与服务器间沟通的桥梁,`Connector`负责接收请求、封装为`Request`和`Response`对象,并传递给`Container`处理。文章通过四个关键问题逐步剖析了`Connector`的工作原理,并深入探讨了其构造方法、`init()`与`start()`方法。通过分析`ProtocolHandler`、`Endpoint`等核心组件,揭示了`Connector`初始化及启动的全过程。本文适合希望深入了解Tomcat内部机制的读者。欢迎关注并点赞,持续更新中。如有问题,可搜索【码上遇见你】交流。
【Tomcat源码分析】从零开始理解 HTTP 请求处理 (第一篇)
|
2月前
|
缓存 前端开发 Java
【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?
【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?
|
4月前
|
缓存 负载均衡 NoSQL
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
72 1
|
4月前
|
应用服务中间件
tomcat服务器get、post请求及响应中文乱码问题
tomcat服务器get、post请求及响应中文乱码问题
|
4月前
|
Java 应用服务中间件 API
Tomcat处理一个HTTP请求的执行流程的详细解析
Tomcat处理一个HTTP请求的执行流程的详细解析
107 4
|
3月前
|
应用服务中间件
tomcat8.5处理get请求时,控制台输出中文乱码问题的解决
tomcat8.5处理get请求时,控制台输出中文乱码问题的解决
45 0
|
4月前
|
Java 应用服务中间件 Linux
Tomcat 调优及 JVM 参数优化
Tomcat 调优及 JVM 参数优化