前言
- 小組項目里之前跑的好好的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配置(適用於沒有使用內置容器的系統)
- 方式3.1 springboot內置tomcat容器配置