java请求路径有特殊符号 Invalid character found in the request target. The valid characters are defined in RFC

最近在项目开发过程中,由于推送到数据库的数据各式各样,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 3986
    at 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启动类
    @Bean
    public TomcatServletWebServerFactory webServerFactory() {
    
    
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addConnectorCustomizers((Connector connector) -> {
    
    
            connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}");
            connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}");
        });
        return factory;
    }

}

在上面添加了需要处理的特殊符号,这样访问接口就不会报错啦。

猜你喜欢

转载自blog.csdn.net/quanqxj/article/details/106856872