springboot支持url带特殊字符
在对接一个项目的时候发现业务方的请求地址参数为一个json字符串,颠覆了我的认知,在我一贯的映象中,类似json中包含了{}等特殊字符,直接传递是不可以的,需要先进行encodeURL操作才行,于是百度了半天,终于找到了支持办法
https://blog.csdn.net/weixin_43102670/article/details/121948244
主要是特殊字符违反了协议违反了RFC 7230 and RFC 3986协议
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
![watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Lev54Gv5LiL5b6Y5b6K,size_20,color_FFFFFF,t_70,g_se,x_16 springboot支持url带特殊字符](https://img-blog.csdnimg.cn/496fab303e854c92ae949cba7a105888.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Lev54Gv5LiL5b6Y5b6K,size_20,color_FFFFFF,t_70,g_se,x_16)
错误分析
原因是URL中存在特殊字符,SpringBoot自带高版本的Tomcat严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了URL中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。通过地址传参时,在URL中传了一段json,传入的参数中有"{","}"不在RFC3986中的保留字段中,无法解析导致报错。
SpringBoot 1.X配置
@Configuration
public class SystemConfig {
public EmbeddedServletContainerFactory webServerFactory() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
// 配置Spring boot支持在URL请求参数中加{}特殊字符
connector.setProperty("relaxedPathChars", "{}");
connector.setProperty("relaxedQueryChars", "{}");
}
});
return factory;
}
}
SpringBoot 2.X配置
@Bean
public TomcatServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
// 配置Spring boot支持在URL请求参数中加{}特殊字符
connector.setProperty("relaxedPathChars","{}");
connector.setProperty("relaxedQueryChars", "{}");
}
});
return factory;
}
发表回复
要发表评论,您必须先登录。