springboot特殊异常-Invalid character found in the request target


前言

  • 小组项目里之前跑的好好的oss文件下载功能突然抛异常了,异常信息:↓
  • Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 ...
  • 发现出现异常的文件路径都有反斜杠 \,这是使用了 File.separator 文件系统分割符出现的。

原因

  • SpringBoot 2.0.0 以上都采用内置tomcat8.0以上版本
  • tomcat8.0以上版本遵从RFC规范添加了对Url的特殊字符的限制
  • url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~四个特殊字符以及保留字符(! * ’ ( ) ; : @ & = + $ , / ? # [ ]) 这些字符

解决

  • 方式1 - 简单url替换
    • 请求发送到后台前替换掉特殊字符
    • 后台拿到后还原
  • 方式2 - 降低Tomcat版本
  • 方式3 - 配置tomcat放开目标字符限制
    • 方式3.1 springboot内置tomcat容器配置
      @SpringBootApplication
      public class XxxApplication {
        public static void main(String[] args) {
        	TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
            SpringApplication.run(XxxApplication.class, args);
        }
        
        @Bean
        public ConfigurableServletWebServerFactory webServerFactory() {
            TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
            factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
                @Override
                public void customize(Connector connector) {
                   // 放开某些字符(反斜杠)限制
                   connector.setProperty("relaxedQueryChars", "\\");
                }
            });
            return factory;
        }                           
      }
      
    • 方式3.2 直接修改外部tomcat的xml配置(适用于没有使用内置容器的系统)

参考

  • Tomcat官方文档页
  • 博文
  • 本文原文地址
  • 博客园同步更新