• 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配置(适用于没有使用内置容器的系统)

    参考

  • 相关阅读:
    Cuckoo for Hashing_双哈希表
    nyoj113_字符串替换
    nyoj366_D的小L_字典序_全排列
    二叉树的前序 中序 后序 遍历(递归/非递归)
    Java 学习路线
    leetcode 04 Median of Two Sorted Arrays
    ThreadLocal 的机制与内存泄漏
    try finally 执行顺序问题
    Java中的类加载器
    快速理解Java中的七种单例模式
  • 原文地址:https://www.cnblogs.com/noodlerkun/p/15594335.html
Copyright © 2020-2023  润新知