按照我的应用程序的特定要求进行 *** 作。服务器需要与客户端完全隔离。客户端应该能够通过它可以使用的任何方法连接到通信服务器。
由于此应用程序的第一个实现将由REST驱动,因此我需要能够从任何地方接受休息。
另外,我想要一个完全没有xml的配置,因此我将Guice与嵌入式Jetty服务器一起使用。由于我没有web.xml文件,因此我无法弄清楚如何设置标头以允许CORS。
经过大量的试验和错误,并阅读了guice文档,我发现了如何将CORS标头添加到离开服务器的响应中。
Guice ServletModule类使您可以向Servlet上下文添加过滤器。这使我可以使所有请求都通过给定的servlet。
由于我试图构建一个响应CORS请求的rest应用程序,因此我需要一个过滤器,该过滤器将cors标头添加到任何请求的响应中。
因此,为了使用guice在嵌入式服务器中启用cors,我构建了一个过滤器,如下所示:
@Singletonpublic class CorsFilter implements Filter{ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { if(response instanceof HttpServletResponse){ HttpServletResponse alteredResponse = ((HttpServletResponse)response); addCorsHeader(alteredResponse); } filterChain.doFilter(request, response); } private void addCorsHeader(HttpServletResponse response){ //TODO: externalize the Allow-Origin response.addHeader("Access-Control-Allow-Origin", "*"); response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, HEAD"); response.addHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept"); response.addHeader("Access-Control-Max-Age", "1728000"); } @Override public void destroy() {} @Override public void init(FilterConfig filterConfig)throws ServletException{}}
Guice提供了一个抽象类,允许您配置Guice Servlet。
配置模块如下所示:
public class RestModule extends ServletModule{ @Override protected void configureServlets() { bind(MyServiceClass.class); // hook Jersey into Guice Servlet bind(GuiceContainer.class); // hook Jackson into Jersey as the POJO <-> JSON mapper bind(JacksonJsonProvider.class).in(Scopes.SINGLETON); Map<String, String> guiceContainerConfig = new HashMap<String, String>(); serve("/*").with(GuiceContainer.class, guiceContainerConfig); filter("/*").through(CorsFilter.class); }}
现在,guice将在每个响应中添加cors标头。无论在哪里提供服务,都允许我的纯HTML 5应用程序与之对话。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)