2012-06-25 66 views
12

Got thông báo lỗi này: Refused to set unsafe header "Origin"từ chối để thiết lập tiêu đề không an toàn "xứ" khi sử dụng XMLHttpRequest của Google Chrome

Sử dụng mã này:

function getResponse() { 
      document.getElementById("_receivedMsgLabel").innerHTML += "getResponse() called.<br/>"; 
      if (receiveReq.readyState == 4 || receiveReq.readyState == 0) { 
       receiveReq.open("GET", "http://L45723:1802", true, "server", "server123"); //must use L45723:1802 at work. 
       receiveReq.onreadystatechange = handleReceiveMessage; 
       receiveReq.setRequestHeader("Origin", "http://localhost/"); 
       receiveReq.setRequestHeader("Access-Control-Request-Origin", "http://localhost"); 
       receiveReq.timeout = 0; 
       var currentDate = new Date(); 
       var sendMessage = JSON.stringify({ 
        SendTimestamp: currentDate, 
        Message: "Message 1", 
        Browser: navigator.appName 
       }); 
       receiveReq.send(sendMessage); 

      } 
     } 

Tôi đang làm gì sai? Tôi đang thiếu gì trong tiêu đề để yêu cầu CORS này hoạt động?

Tôi đã cố gắng loại bỏ các receiveReq.setRequestHeader("Origin", ...) gọi nhưng sau đó Google Chrome ném một lỗi truy cập theo yêu cầu receiveReq.open() tôi ...

Tại sao?

Trả lời

14

Đây chỉ là phỏng đoán, khi tôi sử dụng jquery cho các yêu cầu ajax, bao gồm CORS.

Tôi nghĩ trình duyệt được thiết kế để đặt tiêu đề chứ không phải bạn. Nếu bạn có thể đặt tiêu đề, điều đó sẽ đánh bại mục đích của tính năng bảo mật.

Hãy thử yêu cầu mà không đặt các tiêu đề đó và xem liệu trình duyệt có đặt cho bạn hay không.

+0

Có: chỉ cần xóa mã của bạn đặt tiêu đề yêu cầu "Xuất xứ" - hoạt động tốt cho tôi! –

-6

Bạn đang làm việc trên nhiều miền?

Hãy thử Brian S giải pháp hoặc thử này:

thay vì thiết lập để localhost chỉ cần vượt qua bất cứ điều gì ... và xem những gì sẽ xảy ra.

receiveReq.setRequestHeader("Origin", "*"); 
+1

Từ chối đặt tiêu đề không an toàn "Xuất xứ" –

6

Trong CORS, mã gọi điện không phải thực hiện bất kỳ cấu hình đặc biệt nào. Mọi thứ sẽ được trình duyệt xử lý. Đó là công việc của máy chủ để quyết định xem yêu cầu có nên được cho phép hay không. Vì vậy, bất cứ khi nào bạn đưa ra yêu cầu phá vỡ chính sách SOP, trình duyệt sẽ cố gắng thực hiện yêu cầu CORS cho bạn (nó sẽ tự động thêm tiêu đề Gốc và có thể thực hiện yêu cầu preflight nếu bạn đang sử dụng một số tiêu đề/phương pháp/loại nội dung không an toàn). Nếu máy chủ hỗ trợ CORS nó sẽ trả lời đúng và cho phép/không cho phép theo yêu cầu bằng cách cung cấp CORS tiêu đề phản ứng cụ thể như

Access-Control-Allow-Origin: * 

Hãy ghi nhớ rằng Chrome là rất hạn chế về tên máy chủ 'localhost'. (Ít nhất là khi tôi đang làm việc với nó). Thay vào đó, hãy sử dụng tên máy tính của bạn hoặc gán cho nó một bí danh khác trong tệp 'hosts'. Vì vậy, ví dụ như không truy cập vào trang web của bạn như:

http://localhost:port/myappname 

Thay vì sử dụng:

http://mymachinename:port/myappname 

hoặc

http://mymachinealias:port/myappname 

Để biết thêm chi tiết xin vui lòng kiểm tra specification.

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