我尝试在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.
This live example适用于我的Chrome实例,所以我不知道这里会发生什么。在失败的请求中,我试图直接命中tomcat。
导致失败的原因是什么?
答案 0 :(得分: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)
}
}
答案 1 :(得分: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')
答案 2 :(得分:0)
Access-Control-Allow-Origin
应该包含确切的域名(顺便说一下,对于某些浏览器'*'
也适用),jsbin.com
就可以了。