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:
- 先在
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>
- 实现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
相关产品推荐
相关产品推荐

