【问题标题】:CORS in grails - All requests fail?grails中的CORS - 所有请求都失败了吗?
【发布时间】:2012-04-17 12:38:45
【问题描述】:

我正在尝试在 grails 中设置 CORS 支持,并且我正在使用以下过滤器:

class CorsFilters {
    def filters = {
        all(controller:'*', action:'*') {
            before = {
                response.setHeader("Access-Control-Allow-Origin", "*")
            }
        }
    }
}

从测试来看,似乎所有请求的响应标头都已正确设置,但是当我从外部向本地主机或某些可用的服务器发出请求时,我收到以下错误:

XMLHttpRequest cannot load http://server:8080. Origin http://jsbin.com is not allowed by Access-Control-Allow-Origin.

This live example 在我的 Chrome 实例中工作,所以我不知道这里会发生什么。在失败的请求中,我试图直接打tomcat。

可能会发生什么导致此操作失败?

【问题讨论】:

  • 我想到了两件事。 1.使用localhost(一级域)不是一个好主意;我现在找不到源,但不久前我遇到了麻烦。使用您的主机文件来设置一个假主机。 2. JSBin 中的代码实际上是您用于请求的代码吗?如果没有,一些 JS 库/框架可能会首先发送一个 OPTIONS(预飞行)请求,您需要适当地响应。确认是否是这种情况并且我可以提供响应,我已经在 Grails 中开发了一个解决方案。祝你好运!

标签: javascript ajax grails groovy cors


【解决方案1】:

看起来 Grails 过滤器默认情况下在过滤器链中运行得太晚而无法使用。

如果您生成 web.xml 模板并在 sitemesh 下添加过滤器,则可以。

<filter>
    <filter-name>CORSFilter</filter-name>
    <filter-class>com.blah.CorsFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CORSFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

class CorsFilter implements Filter {
    public void init(FilterConfig fConfig) throws ServletException { }

    public void destroy() { }

    public void doFilter(
            ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        ((HttpServletResponse) response).addHeader(
                "Access-Control-Allow-Origin", "*"
        )
        chain.doFilter(request, response)
    }
}

【讨论】:

  • 只需编辑 BuildConfig.groovy: plugins { runtime ":cors:1.0.0" ... }
  • 我尝试在 src/templates/war/web.xml 中添加 xml 并在 /src/java/com/project/CorsFilter.java 中添加类 CorsFilter 但它无法解析 ServletRequest 等的依赖关系。
【解决方案2】:

您可以动态设置原点。我还建议在适用时添加整组标题。

response.setHeader('Access-Control-Allow-Origin', request.getHeader("Origin"))
response.setHeader('Access-Control-Allow-Methods', 'POST, PUT, GET, OPTIONS, PATCH')
response.setHeader('Access-Control-Allow-Headers', 'X-Additional-Headers-Example')
response.setHeader('Access-Control-Allow-Credentials', 'true')
response.setHeader('Access-Control-Max-Age', '1728000')

【讨论】:

    【解决方案3】:

    Access-Control-Allow-Origin 应该包含准确的域名(顺便说一句,对于某些浏览器,'*' 也可以),jsbin.com 在您的情况下。

    【讨论】:

    • 通配符 * 也是一个完全有效的值 - 请参阅 [spec]
    • 是的,我知道。但浏览器并不关心规格
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 2013-12-06
    • 2019-07-17
    相关资源
    最近更新 更多