解决SpringBoot 报错valid characters are defined in RFC 7230 and RFC 3986

内容纲要

项目中用到了elasticsearch,升级了一下springboot的版本,结果之前很多接口直接报错400
valid characters are defined in RFC 7230 and RFC 3986

原因及解析:

请求地址包含了无效字符, 有效字符的定义是在 RFC 7230 和RFC 3986中定义的。

RFC 3986 规定, URL 只允许包含字母,数字以及四个特殊字符(- _ . ~); 这些字符 ! \* ’ ( ) ; : @ & = + $ , / ? # \[ \] 属于保留字符, 所以是非法字符, 不能出现在URL地址中。

项目上线在即,来不及修改前端产品,只能暂时后端兼容。这边记录一下解决方案。
针对这个问题,通过查阅资料及实测得到了有以下几个解决方案,供各位参考:
1.去除url后面的特殊字符(当前应用场景不适合)
2.改成post请求(针对我的情况也不满足)
3.更换springboot版本,低版本的内置tomcat是没有对请求头做严格校验的,但是这样可能会存在一些其他的风险,不太建议
4.将允许的特殊字符添加到启动类,如下(最终采用的方法)

    @Bean
    public ConfigurableServletWebServerFactory webServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> connector.setProperty("relaxedQueryChars", "[]"));
        return factory;
    }

标签

发表评论