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 - 所有请求都失败了吗?的主要内容,如果未能解决你的问题,请参考以下文章
带有 Spring Security 核心和 CORS 插件的 grails REST API 不适用于 OPTIONS http 方法请求