Jetty服务器配置
我使用Jetty 9并且在配置方面存在一些问题。 我简单的REST工作正常。 但是当我尝试向所有请求和error handling程序添加新标头时,问题就开始了。 我只能通过将此代码添加到每个响应来处理标头:
return Response.ok(murals) .header("Access-Control-Allow-Origin", "*") .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT") .build();
服务器配置:
Server server = new Server(9998); ServletContextHandler servletContextHandler = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS); servletContextHandler.addFilter(GuiceFilter.class, "/*", EnumSet.allOf(DispatcherType.class)); servletContextHandler.addServlet(DefaultServlet.class, "/"); ResourceConfig rc = new ResourceConfig() .register(FilterHeaders.class) .register(ExceptionNotFound.class) .register(CORSFilter.class); //doesnt work new ServletHolder(new ServletContainer(rc)); HandlerWrapper han = new HandlerWrapper(); han.setHandler(new AbstractHandler() { @Override public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { request.setAttribute("welcome","Hello"); //doesn't work } }); servletContextHandler.addFilter(Filters.class, "/*", EnumSet.of(DispatcherType.REQUEST)); //doesnt work ResourceHandler resourceHandler = resourceHandler(); servletContextHandler.setHandler(resourceHandler); servletContextHandler.setHandler(han); server.start(); server.join();
CROSFilter类
public class CORSFilter implements ContainerResponseFilter { @Override public ContainerResponse filter(ContainerRequest request, ContainerResponse response) { response.getHttpHeaders().add("Access-Control-Allow-Origin", "*"); response.getHttpHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization"); response.getHttpHeaders().add("Access-Control-Allow-Credentials", "true"); response.getHttpHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); return response; } }
如何注册标题? 我究竟做错了什么? 我不使用WEB配置。
你将泽西岛1.x与泽西岛2.x混合, 不应该这样做。 您的filter类基于Jersey 1.x. 您的ResourceConfig
是Jersey 2.x. 我知道这是因为Jersey 1.x ResourceConfig
没有register()
方法。 使用Jersey 1.x,这是我们如何注册您的上述filter
resourceConfig.getContainerResponseFilters().add(new CORSFilter());
这就足够了。 但Jersey 2.x没有这种添加filter的方法。 我们需要register
一切。
话虽这么说,如果你使用Jersey 2.x,我强烈建议摆脱你所有的Jersey 1.x依赖。 执行此操作后,您将注意到的第一件事是您的filter类将不再编译。 以下是重构的2.xfilter应如何显示:
import java.io.IOException; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; @Provider public class CORSFilter implements ContainerResponseFilter { @Override public void filter(ContainerRequestContext request, ContainerResponseContext response) throws IOException { response.getHeaders().add("Access-Control-Allow-Origin", "*"); response.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization"); response.getHeaders().add("Access-Control-Allow-Credentials", "true"); response.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); } }
使用上面的filter应该工作。
与peeskillet类似的方法提到了,但我在我的应用程序中在jetty.xml中保存了jetty配置。
因此,要添加自定义filter,我必须在jetty.xml文件中注册它们: