最近在项目开发过程中,由于推送到数据库的数据各式各样,id出现特殊符号,如:{D27E2B76B6D84143AB0F3049570A4F38}
,包含{}
符号,请求地址为http://localhost:8050/api/task/detail?id={D27E2B76B6D84143AB0F3049570A4F38}
结果页面报400错误,后台出现以下报错信息:
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:468) ~[tomcat-embed-core-9.0.30.jar:9.0.30]at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260) ~[tomcat-embed-core-9.0.30.jar:9.0.30]at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.30.jar:9.0.30]at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) [tomcat-embed-core-9.0.30.jar:9.0.30]at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598) [tomcat-embed-core-9.0.30.jar:9.0.30]at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.30.jar:9.0.30]at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_202]at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_202]at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.30.jar:9.0.30]at java.lang.Thread.run(Thread.java:748) [na:1.8.0_202]
会抱这个错误的原因是:我们在交互时,url中传入的参数中包含{}
[]
:
d等这些特殊符号,在高版本的tomcat中含有这些符号的请求会被拦截。
在网上查相关资料,记录的解决方法有很多:
一. 降低tomcat版本
二. 去除URL中的特殊字符;
三. 使用POST方式提交
四. 修改 conf/catalina.properties 文件,重启服务
五.springboot工程中增加一个tomcat 配置,或者将webServerFactory方法加入到springboot启动类
但我这里都不适用,原因如下:
方法一,正式环境已运行多个项目,降低版本可能导致其他组件不能兼容;
方法二:项目中的所有数据由第三方推送,不能修改其数据;
方法三:项目要求严格使用Restful风格,查询接口必须用GET
方式请求
方法四:修改参数较多,比较麻烦,没有测试
最终是用方法五
解决的,最快最有效的方法,将webServerFactory方法加入到springboot启动类,配置代码如下:
import org.apache.catalina.connector.Connector;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);}//将webServerFactory方法加入到springboot启动类@Beanpublic TomcatServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();factory.addConnectorCustomizers((Connector connector) -> {
connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}");connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}");});return factory;}}
在上面添加了需要处理的特殊符号,这样访问接口就不会报错啦。