5

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.

このライブの例は 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 に答える