如何让Jetty重写处理程序优先于Jersey过滤器执行以解决404问题
Jetty RewriteHandler 优先级高于 Jersey Filter 解决方案
你遇到的执行顺序问题核心是默认配置下Jetty RewriteHandler没有放在请求处理链的最顶层,导致请求先进入Servlet Filter链触发Jersey逻辑,还未执行URL重写,以下是两种可行的解决方案:
方案1:调整RewriteHandler为Jetty服务器顶层Handler(最可靠)
修改你的JettyServerCustomizer实现,将原有服务器的整个处理链作为重写Handler的下游,确保所有请求优先经过重写逻辑:
protected static JettyServerCustomizer jettyRewriteHandlerCustomizer() { return server -> { RewriteHandler rewrite = new RewriteHandler(); rewrite.setRewriteRequestURI(true); rewrite.setRewritePathInfo(false); rewrite.setOriginalPathAttribute("originalPath"); RewritePatternRule recommendationApiToNone = new RewritePatternRule(); recommendationApiToNone.setPattern("/recommendation/api/*"); recommendationApiToNone.setReplacement("/"); rewrite.addRule(recommendationApiToNone); // 核心修改:将原有服务器处理链作为重写 handler 的下游逻辑 rewrite.setHandler(server.getHandler()); // 将重写 handler 设为服务器最顶层处理单元,保证优先执行 server.setHandler(rewrite); }; }
原来的insertHandler方法仅将重写Handler插入到现有Handler链的局部位置,修改后所有请求进入Jetty后第一个执行的就是重写逻辑,URL重写完成后才会进入后续的Servlet上下文处理,自然就会在Jersey Filter之前执行。
方案2:调整Jersey Filter执行顺序
如果不想修改Jetty Handler结构,也可以通过配置调低Jersey Filter的优先级,在application配置文件中添加如下配置即可:
spring.jersey.filter.order=10
Spring Boot默认Jersey Filter的优先级为0,数值越大优先级越低,调整后即可保证重写逻辑优先执行完成后再进入Jersey过滤器。
内容的提问来源于stack exchange,提问作者Yibing
相关产品推荐
相关产品推荐

