Access-Control-Allow-Origin不允许起源-如何使用非常简单的Web堆栈和guice启用CORS

Access-Control-Allow-Origin不允许起源-如何使用非常简单的Web堆栈和guice启用CORS,第1张

Access-Control-Allow-Origin不允许起源-如何使用非常简单的Web堆栈和guice启用CORS

按照我的应用程序的特定要求进行 *** 作。服务器需要与客户端完全隔离。客户端应该能够通过它可以使用的任何方法连接到通信服务器。

由于此应用程序的第一个实现将由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应用程序与之对话。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5429209.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存