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

Jetty路径需末尾斜杠问题:无斜杠路径无法访问解决方案咨询

解决Jetty路径末尾斜杠强制要求的问题

我之前处理过好几个Jetty项目里的这种斜杠问题,确实挺头疼的——Jetty对上下文路径的斜杠校验比较严格,不过有几个靠谱的方案能让无斜杠的http://localhost:7071/my-app-name/ui自动指向带斜杠的首页:

方法1:用Jetty RewriteHandler做重定向(推荐)

这是最干净的Jetty层面解决方案,不需要修改应用代码。通过配置RewriteHandler,把无斜杠的路径重定向到带斜杠的版本。

独立Jetty配置(XML方式)

在你的Jetty配置文件(比如jetty.xml或者应用专属的jetty-web.xml)里添加这段配置:

<New id="RewriteHandler" class="org.eclipse.jetty.rewrite.handler.RewriteHandler">
  <Set name="rewriteRequestURI">true</Set>
  <Set name="rewritePathInfo">true</Set>
  <Set name="originalPathAttribute">requestedPath</Set>
  <Call name="addRule">
    <Arg>
      <New class="org.eclipse.jetty.rewrite.handler.RewritePatternRule">
        <Set name="pattern">/my-app-name/ui</Set>
        <Set name="replacement">/my-app-name/ui/</Set>
        <Set name="terminate">true</Set>
      </New>
    </Arg>
  </Call>
</New>

记得把这个RewriteHandler加入到Server的handler链中,确保它在你的WebAppContext之前执行。

嵌入式Jetty配置(代码方式)

如果是用代码启动Jetty,直接在初始化逻辑里添加RewriteHandler:

// 创建重写处理器
RewriteHandler rewriteHandler = new RewriteHandler();
rewriteHandler.setRewriteRequestURI(true);
rewriteHandler.setRewritePathInfo(true);

// 添加无斜杠转带斜杠的规则
RewritePatternRule trailingSlashRule = new RewritePatternRule();
trailingSlashRule.setPattern("/my-app-name/ui");
trailingSlashRule.setReplacement("/my-app-name/ui/");
trailingSlashRule.setTerminate(true);
rewriteHandler.addRule(trailingSlashRule);

// 将WebAppContext设为RewriteHandler的子处理器
WebAppContext webAppContext = new WebAppContext();
webAppContext.setContextPath("/my-app-name/ui/");
webAppContext.setWar("path/to/your/application.war");

rewriteHandler.setHandler(webAppContext);
server.setHandler(rewriteHandler);

方法2:调整WebAppContext上下文路径

直接把WebAppContext的上下文路径设为带斜杠的版本,同时确保欢迎页配置正确:

WebAppContext webAppContext = new WebAppContext();
// 上下文路径末尾带斜杠
webAppContext.setContextPath("/my-app-name/ui/");
webAppContext.setWar("path/to/your/application.war");
// 配置欢迎页,确保首页文件在列表中
webAppContext.setWelcomeFiles(new String[]{"index.html", "index.jsp", "ui.html"});

这种方法需要注意应用内部的资源引用,确保相对路径不会因为上下文路径的变化而失效。

方法3:在应用内添加Servlet过滤器

如果不想修改Jetty全局配置,可以在Web应用里加一个过滤器,拦截无斜杠的路径并转发/重定向:

@WebFilter(urlPatterns = "/ui")
public class TrailingSlashRedirectFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
            throws IOException, ServletException {
        HttpServletRequest httpReq = (HttpServletRequest) request;
        HttpServletResponse httpRes = (HttpServletResponse) response;
        
        // 检查当前请求路径是否是无斜杠的/ui
        String requestUri = httpReq.getRequestURI();
        if (requestUri.equals("/my-app-name/ui")) {
            // 重定向到带斜杠的路径(或者用forward实现内部跳转)
            httpRes.sendRedirect(httpReq.getContextPath() + "/ui/");
            return;
        }
        chain.doFilter(request, response);
    }

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

    @Override
    public void destroy() {}
}

如果是用web.xml配置过滤器,添加这段:

<filter>
    <filter-name>TrailingSlashRedirectFilter</filter-name>
    <filter-class>com.yourpackage.TrailingSlashRedirectFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>TrailingSlashRedirectFilter</filter-name>
    <url-pattern>/ui</url-pattern>
</filter-mapping>

个人最推荐方法1,Jetty原生的RewriteHandler处理这种路径问题最稳妥,也不会侵入应用代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:41:05