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官方文档页
- 博文
- 本文原文地址
- 博客园同步更新