20

我想在服务器端使用 Grails 进行跨源通信。我找到的唯一文档就是这个

https://grails.org/plugin/cors

但这是针对旧版本的 Grails。我发现的其他文档是针对春季的:

https://spring.io/guides/gs/rest-service-cors/

所以我将文件添加到文件SimpleCorsFilter.groovyinit/myproject/中,但我不知道如何将此组件连接到resources.groovy

4

7 回答 7

27

因此,如果您使用 grails 3.2.+到达这里,您可以使用默认方式。

转到您的application.yml并添加:

grails:
    cors:
        enabled: true

它将添加Access-Control-Allow-Origin '*'. 如果您想要不同的东西,请查看此页面

于 2016-12-03T17:17:34.643 回答
12

我们在 resources.groovy 中使用了一个普通的 servlet 过滤器来解决这个问题:

public class CorsFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse resp, FilterChain chain)
            throws ServletException, IOException {

        String origin = req.getHeader("Origin");

        boolean options = "OPTIONS".equals(req.getMethod());
        if (options) {
            if (origin == null) return;
            resp.addHeader("Access-Control-Allow-Headers", "origin, authorization, accept, content-type, x-requested-with");
            resp.addHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS");
            resp.addHeader("Access-Control-Max-Age", "3600");
        }

        resp.addHeader("Access-Control-Allow-Origin", origin == null ? "*" : origin);
        resp.addHeader("Access-Control-Allow-Credentials", "true");

        if (!options) chain.doFilter(req, resp);
    }
}

资源.groovy:

beans = {
    corsFilter(CorsFilter)
}

这适用于使用基本身份验证的 CORS 请求。我编写了 Grails 2.x 插件,这似乎比让它与 Grails 3 一起工作更容易。

于 2015-05-14T12:17:14.660 回答
9

具体来说,这里有一些有效的代码。请注意,拦截器名称必须与您的控制器名称(此处为 workRequest)相匹配,域需要是您从中调用的任何内容(此处为 localhost:8081),并且它是您想要的 before() 方法:

package rest
class WorkRequestInterceptor {
boolean before() { 
    header( "Access-Control-Allow-Origin", "http://localhost:8081" )
    header( "Access-Control-Allow-Credentials", "true" )
    header( "Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE" )
    header( "Access-Control-Max-Age", "3600" )  
    true 
}

boolean after() { true }
}
于 2015-05-10T20:26:53.967 回答
6

当我遇到 CORS 问题时,我正在使用 emberjs 框架和 Grails 3.0 REST 应用程序。遵循本文http://www.greggbolinger.com/rendering-json-in-grails-for-ember-js/中的步骤帮助我走得更远。

本文展示了如何使用新的拦截器创建设置正确标头的 CorsInterceptor 类。

class CorsInterceptor {

  CorsInterceptor() {
    matchAll()
  }

  boolean before() {
    header( "Access-Control-Allow-Origin", "http://localhost:4200" )
    header( "Access-Control-Allow-Credentials", "true" )
    header( "Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE")
    header( "Access-Control-Max-Age", "3600" )
    true
  }

  boolean after() { true }
}

这对 GET 请求按预期工作,但对 POST 和 PUT 请求失败。原因是 OPTIONS 预检请求首先发送到http://localhost:8080/mycontroller/1234,在我的情况下导致404 未找到返回。

在此答案https://stackoverflow.com/a/31834551的帮助下,我将 CorsInterceptor 类改为:

class CorsInterceptor {

   CorsInterceptor() {
    matchAll()
  }

  boolean before() {
    header( "Access-Control-Allow-Origin", "http://localhost:4200" )
    boolean options = ("OPTIONS" == request.method)
    if (options) {

        header( "Access-Control-Allow-Origin", "http://localhost:4200" )
        header( "Access-Control-Allow-Credentials", "true" )
        header( "Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE")
        header( "Access-Control-Max-Age", "3600" )

        response.status = 200
    }

    true 
  }

  boolean after() { true }

}

现在 POST 和 PUT 请求正在工作。

于 2016-03-23T11:18:47.323 回答
3

您应该使用 grails 3 的新拦截器 API。(https://grails.github.io/grails-doc/3.0.x/guide/single.html#interceptors

grails create-interceptor您可以使用该命令创建拦截器。对于 CORS 拦截器,我将使用after()此拦截器的方法,并将其设置为匹配所有请求(或仅匹配您需要的请求)。您可以response在此方法中使用该对象,因此设置标头应类似于 Spring 文档中描述的情况。

于 2015-04-12T09:14:05.460 回答
3

我发现的 grails 3.1.x 最干净和最简单的解决方案是添加 Apache 默认 CorsFilter:

import org.apache.catalina.filters.CorsFilter

// Place your Spring DSL code here
beans = {
    corsFilter(CorsFilter) //Custom CorsFilter under src/main/java/ works as well. I prefer Apache though...
}

#user215556 的答案也可以,但是 Apache Cors 过滤器的默认设置也可以

于 2016-07-21T14:52:42.417 回答
0

如果您需要为 Spring Security 核心/休息插件提供的端点启用 CORS,您必须添加以下内容:

引导程序.groovy:

SpringSecurityUtils.clientRegisterFilter("corsFilter",
    SecurityFilterPosition.SECURITY_CONTEXT_FILTER.order - 1)

资源.groovy:

beans = {
    corsFilter(CorsFilter)
}
于 2019-09-14T21:00:56.793 回答