grails中的CORS - 所有请求都失败了吗?

Posted

技术标签:

【中文标题】grails中的CORS - 所有请求都失败了吗?【英文标题】:CORS in grails - All requests fail? 【发布时间】: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 中开发了一个解决方案。祝你好运! 【参考方案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]。 是的,我知道。但浏览器并不关心规格

以上是关于grails中的CORS - 所有请求都失败了吗?的主要内容,如果未能解决你的问题,请参考以下文章

由于CORS政策,谷歌oAuth的角度请求失败

带有 Spring Security 核心和 CORS 插件的 grails REST API 不适用于 OPTIONS http 方法请求

IE 11 上 CORS 预检请求的奇怪问题失败

AngularJS 中的跨域 HTTP 请求失败

docker-compose 环境中的 CORS 请求失败

2021-09-13 一文解析前端请求307导致CORS跨域失败