5

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

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

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

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

这个现场示例适用于我的 Chrome 实例,所以我不知道这里会发生什么。在失败的请求中,我试图直接点击 tomcat。

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

4

3 回答 3

2

看起来 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)
    }
}
于 2012-04-03T20:31:57.817 回答
1

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

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')
于 2012-04-03T23:58:41.883 回答
0

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

于 2012-04-03T20:07:54.613 回答