如何在 Undertow 中启用 Access-Control-Allow-Origin?

Posted

技术标签:

【中文标题】如何在 Undertow 中启用 Access-Control-Allow-Origin?【英文标题】:How to enable Access-Control-Allow-Origin in Undertow? 【发布时间】:2017-06-23 08:08:37 【问题描述】:

试试 1

builder.setHandler(new HttpHandler() 
                @Override
                public void handleRequest(final HttpServerExchange exchange) throws Exception 
                    exchange.getResponseHeaders().put(new HttpString("Access-Control-Allow-Origin"), "*");
                    exchange.getResponseHeaders().put(new HttpString("Access-Control-Allow-Methods"),
                            "GET, POST, PUT, DELETE, OPTIONS");
                    String ss = exchange.getResponseHeaders().get(new HttpString("Access-Control-Allow-Headers"))
                            .getFirst();
                    System.out.println(ss);
                    exchange.getResponseHeaders().put(new HttpString("Access-Control-Allow-Headers"), ss);
                
            );

试试 2

HttpHandler enHandler = new SetHeaderHandler("Access-Control-Allow-Origin", "*");
builder.setHandler(enHandler);

我尝试了上述设置以在我的 undertow 服务中启用 CORS,但它不适用于我的 Angular UI。在邮递员中工作正常。

【问题讨论】:

当你说不工作时,你到底是什么意思?您能告诉我们请求中包含哪些标头,响应中返回哪些标头? 【参考方案1】:

添加这些行后它可以工作

        ResteasyDeployment rd = new ResteasyDeployment();
        CorsFilter filter = new CorsFilter();
        filter.setAllowedMethods("GET,POST,PUT,DELETE,OPTIONS");
        filter.getAllowedOrigins().add("*");
        rd.setProviderFactory(new ResteasyProviderFactory());
        rd.getProviderFactory().register(filter);

【讨论】:

如果您希望在 servlet 部署中使用 CORS,那么这是要走的路,但如果您想要像文件处理程序这样的任何 HttpHandler,则没有用 这是 RESTEasy (JAX-RS) 特定的,不是对所提出问题的通用答案。 P.S.:注册 CorsFilter 的一种更加与 JAX-RS 实现无关的方法是创建一个 @Providerimplements Feature。但是 CorsFilter 本身仍然是 RESTEasy 特定的。【参考方案2】:

我最近遇到了与 Undertow 服务器添加 Access-Control-Allow-Origin 标头的能力相同的问题。

虽然不是很方便,但我可以在 HttpHandler.handleRequest 方法中设置标头,如下所示:

httpServerExchange.getResponseHeaders()
                .put(new HttpString("Access-Control-Allow-Origin"), "*");

如UNDERTOW-1376 中所述,Undertow 社区似乎建议使用undertow-cors-filter 或cors-filter 作为社区开发的解决方案。

【讨论】:

【参考方案3】:

当未经身份验证的请求访问受保护的资源时,基于 Servlet 的过滤器将没有机会拦截此类发送 CORS 标头的请求。因此,任何基于 servlet 的过滤器都可能不适合此类要求。

此外,undertow-cors-filter 似乎没有更新并且无法正常工作(当我尝试使用 Wildfly 15 时)。它因正则表达式相关错误而失败。

可以在 Wildfly 中使用 Undertow 谓词和交换属性来实现 CORS 过滤器功能。正则表达式可用于定义要列入白名单的域列表。通过检查传入的 Origin 标头并使用正则表达式匹配将其与白名单进行比较,可以有条件地写入与 CORS 相关的响应标头。所有这些都可以在 Wildfly 的standalone.xml 中进行配置,无需任何 Java 编码。下面的文章解释了相同的。

https://medium.com/amritatech/a-mechanism-to-enable-cors-filter-with-no-coding-57ef2906e023

【讨论】:

以上是关于如何在 Undertow 中启用 Access-Control-Allow-Origin?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Undertow 中启用 Access-Control-Allow-Origin?

在 JBOSS EAP 7.1 中,如何将 EJB 和 undertow 的统计启用设置为 True?

如何在嵌入式 Undertow 服务器上启用目录列表和资源服务?

在 Undertow 中启用 HTTPS

如何将 bean 注入 Undertow 中的 servlet 过滤器?

如何使用 Apache 作为 WebSockets 的反向代理,以 Undertow 作为服务器