我的休息服务在Jersey服务器上运行,配置如下:
try {
final ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath(serverConfig.getContextPath());
final Server jettyServer = new Server(serverConfig.getPort());
jettyServer.setHandler(context);
ResourceConfig config = new ResourceConfig();
config.register(CORSResponseFilter.class);
final ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, serverConfig.getBaseName());
jerseyServlet.setInitOrder(0);
jerseyServlet.setInitParameter("jersey.config.server.provider.packages", "com.myRest.rest");
jerseyServlet.setInitParameter("jersey.config.server.provider.classnames", entryPoints());
jettyServer.start();
jettyServer.join();
} catch (Exception e) {
e.printStackTrace();
}
我试图修改所有回复的标题,以便我使用过滤器:
@Provider
public class CORSResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
throws IOException {
MultivaluedMap headers = responseContext.getHeaders();
headers.add("Access-Control-Allow-Origin", "*");
headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia");
}
}
但是,出于某种原因,永远不会调用此过滤器。
我使用的是embebed jetty 9.2.13.v20150730。我看到一些建议改变web.xml的答案,但我没有使用xml配置。
答案 0 :(得分:1)
由于某种原因,永远不会调用此过滤器
因为您未使用ResourceConfig
执行任何与您注册过滤器的操作。您可以实例化它,而不是将ServletContainer
类用于addServlet
,而是将ResourceConfig
传递给构造函数。
ServletHolder jerseyServlet = new ServletHolder(new ServletContainer(config));
jerseyServlet.setInitOrder(0);
context.addServlet(jerseyServlet, serverConfig.getBaseName());
也可以使用ResourceConfig
注册所有内容,而不是使用init参数。您可以使用packages
方法设置包扫描,只需使用register
方法注册所有提供程序(而不是使用带有init-param的String类名)。
ResourceConfig config = new ResourceConfig()
.packages("com.myRest.rest")
.register(CORSResponseFilter.class)
.register(AnyOtherProviderClass.class)
.register(LikeTheOnesYouListedInThe_entryPoints.class)