25

收到此错误消息: Refused to set unsafe header "Origin"

使用此代码:

   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);

            }
        }

我究竟做错了什么?为了使这个 CORS 请求正常工作,我在标题中缺少什么?

我尝试删除receiveReq.setRequestHeader("Origin", ...)呼叫,但 Google Chrome 在我的receiveReq.open()呼叫中引发访问错误...

为什么?

4

3 回答 3

22

这只是一个猜测,因为我将 jquery 用于 ajax 请求,包括 CORS。

我认为浏览器应该设置标题,而不是你。如果您能够设置标题,那将破坏安全功能的目的。

在不设置这些标头的情况下尝试请求,看看浏览器是否为您设置了它们。

于 2012-06-25T02:39:19.180 回答
15

在 CORS 中,调用代码不需要做任何特殊的配置。一切都应该由浏览器处理。决定是否允许请求是服务器的工作。因此,每当您发出违反 SOP 政策的请求时,浏览器都会尝试为您发出 CORS 请求(它会自动添加 Origin 标头,如果您使用一些不安全的标头/方法/内容类型,可能会发出预检请求)。如果服务器支持 CORS,它将正确响应并通过提供 CORS 特定的响应标头来允许/禁止请求,例如

Access-Control-Allow-Origin: *

请记住,Chrome 对“localhost”主机名的限制非常严格。(至少在我使用它的时候是这样)。而是使用您的计算机名称或在“主机”文件中为其分配另一个别名。因此,例如不要访问您的网站,例如:

http://localhost:port/myappname

而是使用:

http://mymachinename:port/myappname

或者

http://mymachinealias:port/myappname

有关更多详细信息,请查看规格

于 2014-07-21T06:56:27.683 回答
-8

你是跨域工作吗?

试试 Brian S 解决方案或试试这个:

而不是设置为 localhost 只是传递任何东西......看看会发生什么。

receiveReq.setRequestHeader("Origin", "*");
于 2012-07-31T17:36:03.000 回答