springboot支持url带特殊字符

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带特殊字符

错误分析
原因是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;
}