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文件中注册它们:

         com.sun.jersey.config.property.packages ...my package   com.sun.jersey.spi.container.ContainerResponseFilters ...MyCorsResponseFilter