Jetty静态资源服务器配置CrossOriginFilter后CORS header不生效排查
Jetty静态资源服务添加CORS Header无效的问题解决
你遇到的问题核心原因是Jetty的Servlet Filter不会作用于ResourceHandler处理的请求。
你的代码里,CrossOriginFilter配置在ServletContextHandler下,但静态资源是通过ResourceHandler提供的——ResourceHandler属于Jetty的Handler组件,它会直接处理请求并返回响应,完全不走Servlet的处理流程,所以你配置的Filter根本不会被触发,自然不会添加CORS Header。
给你两种可行的解决办法:
方法一:改用DefaultServlet处理静态资源(推荐)
把ResourceHandler替换成Jetty自带的DefaultServlet,它是Servlet实现,会走Filter链,这样你的CORS Filter就能生效:
private Server initServer() { Server staticServer = new Server(8181); ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); // 保留原有的CORS Filter配置 FilterHolder filterHolder = getFilterHolder(); context.addFilter(filterHolder, "/*", EnumSet.allOf(DispatcherType.class)); // 用DefaultServlet替代ResourceHandler ServletHolder defaultServlet = new ServletHolder("default", DefaultServlet.class); defaultServlet.setInitParameter("resourceBase", DIR_ASSETS.toString()); defaultServlet.setInitParameter("dirAllowed", "true"); defaultServlet.setInitParameter("directoriesListed", "true"); context.addServlet(defaultServlet, "/*"); staticServer.setHandler(context); return staticServer; } // 保留原有的getFilterHolder方法,移除多余参数 private static FilterHolder getFilterHolder() { FilterHolder filterHolder = new FilterHolder(new CrossOriginFilter()); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*"); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,POST,HEAD"); filterHolder.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "X-Requested-With,Content-Type,Accept,Origin"); // 注意:ACCESS_CONTROL_ALLOW_ORIGIN_HEADER参数不需要手动设置,Filter会自动处理 return filterHolder; }
方法二:用CrossOriginHandler包装ResourceHandler
如果非要保留ResourceHandler,可以用Jetty的CrossOriginHandler来包装它,直接在Handler层面添加CORS Header:
private Server initServer() { Server staticServer = new Server(8181); ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); ResourceHandler resourceHandler = new ResourceHandler(); resourceHandler.setDirAllowed(true); resourceHandler.setDirectoriesListed(true); resourceHandler.setResourceBase(DIR_ASSETS.toString()); // 用CrossOriginHandler包装ResourceHandler CrossOriginHandler corsHandler = new CrossOriginHandler(); corsHandler.setAllowedOrigins(Collections.singletonList("*")); corsHandler.setAllowedMethods(Arrays.asList("GET", "POST", "HEAD")); corsHandler.setAllowedHeaders(Arrays.asList("X-Requested-With", "Content-Type", "Accept", "Origin")); corsHandler.setHandler(resourceHandler); context.setHandler(corsHandler); staticServer.setHandler(context); return staticServer; }
这种方式不需要配置Servlet Filter,直接在Handler链中处理CORS逻辑。
内容的提问来源于stack exchange,提问作者RudolphHeret
相关产品推荐
相关产品推荐

