tomcat容器get请求数组参数

前言

​ 后台项目中,我们的web容器一般都会undertow 来替代tomcat,因为undertow 相比tomcat来说,有更好的性能,尤其高并发场景,undertow 更好

问题

​ 最近项目上遇到一个问题,前端的一个get请求中,包含了一个数组参数,如下http://192.168.1.136:9999/station/daily/page?current=1&size=10&projectId[]=1678320473978552321&projectId[]=1678657737061416962&descs[]=create_time,其中的projectId是各数组,可以传多个,发起请求后,总是报400错误,400一般都是参数错误导致的,具体报错信息如下:

1
Invalid character found in the request target [/daily/page?projectId[]=1686286504424910850&current=1&size=10&descs=create_time ]. The valid characters are defined in RFC 7230 and RFC 3986

解释一下这个错误:

​ 这个错误通常是由于请求 URL 中包含了无效字符导致的。HTTP URL 遵循 RFC 7230 和 RFC 3986 中定义的字符规范,不允许包含某些特殊字符,如方括号 [] 在 URL 中通常被视为无效字符。

解决

既然是未编码导致的,我直接拿去编码了一下,然后再请求果然就没有问题了!但这个不是关键,因为项目是多模块,我在其他模块中发现有类似的有数组参数的get请求,后端响应式正常的,这就很奇怪了

​ 一开始以为式前端问题,没有编码导致的,经过一番查找和思考后发现,不是前端问题,因为前端所有请求都是用axios封装的一套工具类,并且用postman直接请求接口也是一样的,所以问题应该还在后端

​ 重新整理了一下思路,因为是无法解码导致的参数错误,所以和我们自己写的代码是没有关系的,既然这样,应该就是底层的处理出了一些问题,经过一番查找后,再详细的错误信息中发现有tomcat字样,因为项目各模块基本都是用undertow替代了tomcat的,但是这里的报错居然有tomcat

​ 所有去pom文件里一查,还真有一个tomcat的依赖,如下

1
2
3
4
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
</dependency>

由于这个依赖不是我加的,所以不知道哪里引用了,所以去掉后,build 了一下发现有报错,仔细一看,这个依赖只是为了用一个base64的工具类,立马就删掉了,用hutool中的同类替代,再次build发现正常,运行后,再用上面的数组参数测试,发现一切正常

结语

项目中尽量别用tomcat,这个容器比较老了,不够轻量化,所以能用undertow的尽量用