栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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应用程序与之对话。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/453683.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号