基于springboot的restful接口的请求地址含有特殊字符被项目自带tomcat拦截问题
Posted 左直拳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于springboot的restful接口的请求地址含有特殊字符被项目自带tomcat拦截问题相关的知识,希望对你有一定的参考价值。
写了一个基于springboot的restful接口,但按照设计,请求地址十分古怪,类似这样:
http://192.168.10.8:8080/?skey=fb5e8ea9249c4ac19dad5e2a341e09ce&filter[]=A3011300500,eq,35041&filter[]=A3001200400,ge,2021-01-01 00:00&filter[]=A3001200400,le,2021-02-01 00:00&satisfy=AND
可以发现,地址后面的参数中,含有多个"filter[]",里面有一对方框。结果请求的时候,根本无法到达控制器。浏览器直接显示:HTTP Status 400 – Bad Request。
写了拦截器、过滤器,想着将请求拦截下来,修改参数名。但请求也根本未到达这一层。不过请求的时候,程序是有反应的,给出了报错信息:
java.lang.IllegalArgumentException: Invalid character found in the request target [/?skey=fb5e8ea9249c4ac19dad5e2a341e09ce&filter[]=A3011300500,eq,35041&filter[]=A3001200400,ge,2021-01-01 00:00&filter[]=A3001200400,le,2021-02-01 00:00&satisfy=AND ]. The valid characters are defined in RFC 7230 and RFC 3986
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:494) ~[tomcat-embed-core-9.0.60.jar:9.0.60]
估计是自带的tomcat版本是9,会拦截掉特殊字符。解决方法是将tomcat的配置注册到springboot启动类中:
import org.apache.catalina.connector.Connector;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TomcatConfig
@Bean
public TomcatServletWebServerFactory webServerFactory()
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers((Connector connector) ->
connector.setProperty("relaxedPathChars", "\\"<>[\\\\]^`|");
connector.setProperty("relaxedQueryChars", "\\"<>[\\\\]^`|");
);
return factory;
以上是关于基于springboot的restful接口的请求地址含有特殊字符被项目自带tomcat拦截问题的主要内容,如果未能解决你的问题,请参考以下文章
springboot的服务端Restful风格 API接口,在不同场景下,设置不同的请求及传参方式的设计,及其他异常场景解决方案
Springboot第五章 接口架构风格 — RESTful