2012-04-03 35 views
5

Tôi đang cố gắng để thiết lập hỗ trợ CORS trong grails, và tôi đang sử dụng bộ lọc sau:CORS trong grails - Tất cả các yêu cầu thất bại?

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

Từ thử nghiệm, nó trông giống như các tiêu đề phản ứng được thiết lập đúng cho tất cả các yêu cầu, nhưng khi tôi thực hiện một yêu cầu bên ngoài chống lại localhost hoặc một số máy chủ có sẵn cho tôi, tôi nhận được lỗi sau:

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

This live example công trình trong trường hợp của tôi về Chrome, vì vậy tôi không biết những gì có thể xảy ra ở đây. Trong các yêu cầu thất bại, tôi đang cố gắng nhấn tomcat trực tiếp.

Điều gì có thể xảy ra để gây ra lỗi này?

+0

Hai điều cần lưu ý. 1. Sử dụng localhost (tên miền cấp 1) không phải là một ý tưởng hay; Tôi không thể tìm thấy nguồn ngay bây giờ, nhưng tôi đã gặp rắc rối cách đây không lâu với điều này. Sử dụng tệp máy chủ của bạn để thiết lập máy chủ giả. 2. Mã nguồn trong JSBin có thực sự là những gì bạn đang sử dụng cho yêu cầu không? Nếu không, một số thư viện/khung công tác JS có thể gửi yêu cầu OPTIONS (được đặt trước chuyến bay) trước tiên, mà bạn cần phản hồi một cách thích hợp. Xác nhận nếu đây là trường hợp và tôi có thể cung cấp một phản ứng, tôi đã phát triển một giải pháp trong Grails. Chúc may mắn! – Esteban

Trả lời

2

Dường như Bộ lọc Grails, theo mặc định, chạy quá muộn trong chuỗi bộ lọc sẽ được sử dụng.

Nếu bạn tạo mẫu web.xml và thêm bộ lọc bên dưới sitemesh, công trình này sẽ hoạt động.

<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) 
    } 
} 
+7

Tôi đã viết một plugin Grails để làm điều này: http://grails.org/plugin/cors –

+2

Chỉ cần chỉnh sửa BuildConfig.groovy: plugins {runtime ": cors: 1.0.0" ... } –

0

Access-Control-Allow-Origin phải chứa tên miền chính xác (btw, đối với một số trình duyệt '*' cũng hoạt động), jsbin.com trong trường hợp của bạn.

+0

Ký tự đại diện, '*' cũng là một giá trị hoàn toàn hợp lệ - xem [\ [spec \]] (http://www.w3.org/TR/cors/#http-access-control-allow-origin). –

+0

Vâng, tôi biết. Nhưng các trình duyệt không quan tâm đến thông số kỹ thuật –

1

Bạn có thể thiết lập các gốc tự động. Tôi cũng khuyên bạn nên thêm toàn bộ các tiêu đề khi áp dụng.

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') 
+0

Tại sao điều này tốt hay cần thiết? –

Các vấn đề liên quan