我使用 Jetty 9,但配置有一些问题。我简单的 REST 效果很好。但是当我尝试向所有请求和错误处理程序添加新标头时,问题就开始了。我能够处理标头的唯一方法是将以下代码添加到每个响应中:
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();
CROS过滤器类
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配置。