The valid characters are defined in RFC 7230 and RFC 3986错误解决方案

问题情况
The valid characters are defined in RFC 7230 and RFC 3986
这个错误提示来自 Tomcat,表示请求的 URI 中包含了不符合 RFC 7230 和 RFC 3986 标准的字符,导致服务器返回了 400 Bad Request。,我发现问题出在路径参数(path parameter)中:它包含了方括号 [],而这些字符在 Tomcat 的默认配置下被视为非法字符。

问题根源
Tomcat 对 URI 的解析遵循 RFC 7230 和 RFC 3986 标准,默认对一些特殊字符有限制,包括但不限于 <, >, [, ], , ^, ```, {, |, }, ~ 等。当请求的路径中出现这些字符时,Tomcat 会直接拒绝解析,认为这是非法的 URI,从而抛出上述错误。
在我的案例中,路径参数中包含了 **[],例如 /api/resource/[id],**触发了 Tomcat 的限制规则。这让我意识到,服务器端的默认配置并不允许这些特殊字符直接出现在 URI 中。

解决方案
这里展现的是基于SpringBoot的解决方案

  • 第一种(推荐),通过yml文件配置,将tomcat的检验规则弱化
server:
  tomcat:
    uri-encoding: UTF-8
    relaxed-query-chars: [ '|', '{', '}', '[', ']', ',' ]
    relaxed-path-chars: [ '|', '{', '}', '[', ']', ',' ]
  • 第二种,直接编写配置类
@Bean
public TomcatServletWebServerFactory tomcatFactory() {
    return new TomcatServletWebServerFactory() {
        @Override
        protected void postProcessContext(Context context) {
            context.setRelaxedPathChars("|{}[],");
        }
    };
}

补充知识

  • Tomcat 的 URI 解析规则
    Tomcat 的默认行为基于 RFC 7230 和 RFC 3986,对 URI 中的特殊字符有严格限制。除了 relaxed-path-chars,还有以下相关配置项值得关注:
  • uri-encoding:设置 URI 的字符编码,默认是 ISO-8859-1,建议改为 UTF-8 以支持多语言。
  • relaxed-query-chars:放宽查询字符串(query string)中允许的特殊字符。
  • relaxed-path-chars:放宽路径中允许的特殊字符(本次使用的配置)。

你可能感兴趣的:(SpringBoot,firefox,服务器,前端,java,ide,intellij-idea,运维)