You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetty遇连续多斜杠URI返回400,如何配置使其同Tomcat兼容?

问题

客户端发起请求 https://app.foo.com/foo//bar/baz/,同一war包部署在Tomcat时能正常解析并返回预期内容,但部署到Jetty后,相同URI会返回400错误请求。能不能配置Jetty,让它像Tomcat一样把URL里的2个及以上连续斜杠当成单个斜杠,避免返回400错误?

解决方案

Jetty默认严格遵循RFC规范,会把带连续斜杠的URI判定为无效请求返回400,但可以通过以下两种方式调整配置,和Tomcat行为对齐:

方法1:全局配置Jetty自动规范化URI

在Jetty的核心配置文件(比如jetty.xml)中,找到HttpConfiguration节点,添加normalizeUri="true"属性:

<Configure id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
  <!-- 保留原有其他配置 -->
  <Set name="normalizeUri">true</Set>
</Configure>

开启这个配置后,Jetty会在处理请求前自动规范化URI,包括合并连续斜杠、移除末尾多余斜杠等操作,和Tomcat的处理逻辑一致。

方法2:在Web应用内通过Filter处理

如果不想修改Jetty全局配置,也可以在你的war包的web.xml里添加自定义Filter来手动处理URI:

  1. 先在web.xml中声明Filter:
<filter>
  <filter-name>UriNormalizationFilter</filter-name>
  <filter-class>com.yourpackage.UriNormalizationFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>UriNormalizationFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
  1. 实现Filter类,替换URI里的连续斜杠:
public class UriNormalizationFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String uri = httpRequest.getRequestURI();
        // 把多个连续斜杠替换成单个
        String normalizedUri = uri.replaceAll("/+", "/");
        if (!uri.equals(normalizedUri)) {
            // 转发到规范化后的URI
            request.getRequestDispatcher(normalizedUri).forward(request, response);
            return;
        }
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}
    @Override
    public void destroy() {}
}

注意点

  • normalizeUri="true"这个配置从Jetty 9.2版本开始支持,如果你用的是更早的Jetty版本,可能需要通过自定义HandlerWrapper来实现URI规范化。
  • 开启URI规范化后,要确认你的应用逻辑不会依赖连续斜杠的特殊处理,避免出现意外问题。

内容的提问来源于stack exchange,提问作者zelinka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 06:20:58