2015-07-07 13 views
26

Tôi đang gọi chức năng này từ biểu mẫu asp.net của tôi và nhận lỗi sau trên bảng điều khiển firebug trong khi gọi ajax.Tiêu đề CORS 'Access-Control-Allow-Origin' thiếu

Yêu cầu xuất xứ bị chặn: Chính sách xuất xứ giống nhau không cho phép đọc tài nguyên từ xa tại http://anotherdomain/test.json. (Lý do: CORS header 'Access-Control-Allow-Origin' bị thiếu).

var url= 'http://anotherdomain/test.json'; 
     $.ajax({ 
      url: url, 
      crossOrigin: true, 
      type: 'GET', 
      xhrFields: { withCredentials: true }, 
      accept: 'application/json' 
     }).done(function (data) { 
      alert(data);     
     }).fail(function (xhr, textStatus, error) { 
      var title, message; 
      switch (xhr.status) { 
       case 403: 
        title = xhr.responseJSON.errorSummary; 
        message = 'Please login to your server before running the test.'; 
        break; 
       default: 
        title = 'Invalid URL or Cross-Origin Request Blocked'; 
        message = 'You must explictly add this site (' + window.location.origin + ') to the list of allowed websites in your server.'; 
        break; 
      } 
     }); 

tôi đã thực hiện cách thay thế nhưng vẫn không thể tìm ra giải pháp.

Lưu ý: Tôi không có quyền máy chủ để thực hiện thay đổi phía máy chủ (API/URL).

+1

Liệu 'anotherdomain' hỗ trợ jsonp? Nếu không, hãy đọc chủ đề trùng lặp này http://stackoverflow.com/questions/20035101/no-access-control-allow-origin-header-is-present-on-the-requested-resource?rq=1 –

+0

@PatrickMurphy, không có ' anotherdonain' không hỗ trợ CORS. Tôi nhận được thông báo 'Tiêu đề =' URL không hợp lệ hoặc Yêu cầu xuất xứ bị chặn '; '. –

+0

jsonp cho phép bạn chuyển một tham số gọi lại của một loại nào đó cho phép bạn nhận dữ liệu được bao bọc bởi json mà không có 'cors' –

Trả lời

22

Điều này thường xảy ra khi bạn thử truy cập tài nguyên của một miền khác.

Đây là tính năng bảo mật để tránh mọi người tự do truy cập bất kỳ tài nguyên nào của miền đó (có thể truy cập ví dụ để có cùng một bản sao trang web của bạn trên một tên miền cướp biển).

Khi mã gửi yêu cầu, bạn sẽ có mã phản hồi "200 OK" trong bảng điều khiển trình duyệt, điều đó có nghĩa là tài nguyên được truy cập, nhưng không cấp quyền chia sẻ tài nguyên đó. Nó thực hiện điều này bằng cách không cho phép "Access-Control-Allow-Origin".

Để thay đổi điều đó, bạn phải viết những dòng này trong .htaccess của tập tin miền được yêu cầu (notyourdomain.com):

<IfModule mod_headers.c> 
    Header set Access-Control-Allow-Origin "*" 
    </IfModule> 

giải pháp khác là tự sao chép các tập tin vào máy chủ/tên miền của bạn :)

Hòa bình và mã;)

+0

Hi @ Sébastien Garcia-Roméo, tôi đã thêm rằng vào .htaccess của tôi nhưng tôi vẫn nhận được cùng một "Cross-Origin Request Blocked: Chính sách xuất xứ tương tự không cho phép đọc tài nguyên từ xa tại ..." vấn đề. Bạn có biết điều đó có thể là gì không? Cảm ơn bạn – Jeff

+0

Điều này có thể là rất nhiều thứ ... tốt nhất là có phương tiện được yêu cầu trên cùng một máy chủ nếu có thể ... –

+0

Jeff: đảm bảo mô-đun mod_headers được bật trong cấu hình máy chủ của bạn. Như bạn đã nhận thấy, câu trả lời của gkubed phải tuân theo thử nghiệm IfModule. Trong thực tế, cách tốt nhất là không quấn nó bên trong thử nghiệm này, do đó, một lỗi được nêu ra nếu mô-đun này không có sẵn trên máy chủ của bạn. –

6

trong yêu cầu ajax của bạn, nói thêm:

dataType: "jsonp", 

sau dòng:

type: 'GET', 

nên giải quyết vấn đề này ..

hy vọng điều này giúp bạn

+4

Đây không phải là bản sửa lỗi được đảm bảo và sẽ chỉ * hoạt động nếu miền nhận được được định cấu hình để phản hồi ở định dạng JSONP. Nếu miền không được kích hoạt CORS, rất có khả năng JSONP sẽ không hoạt động. Cũng lưu ý rằng JSON và JSONP không thể hoán đổi cho nhau. –

+0

Tôi có vấn đề này với wikipedia và nó là sửa chữa duy nhất mà làm việc !!! – ChaosPredictor

+2

JSONP chỉ hoạt động đối với phương thức/loại GET. :) –

2

Bạn cần phải sửa đổi mã phía máy chủ của bạn, như đưa ra dưới đây

public class CorsResponseFilter implements ContainerResponseFilter { 
@Override 
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) 
    throws IOException { 
     responseContext.getHeaders().add("Access-Control-Allow-Origin","*"); 
     responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); 

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