当前位置: 代码迷 >> 综合 >> java请求路径有特殊符号 Invalid character found in the request target. The valid characters are defined in RFC
  详细解决方案

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

热度:66   发布时间:2023-12-11 16:20:11.0

最近在项目开发过程中,由于推送到数据库的数据各式各样,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;}}

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

  相关解决方案