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
相关产品推荐
相关产品推荐

