使用谷歌浏览器的xmlHttpRequest时拒绝设置不安全的标题"Origin"

Der*_*LAU 16 ajax comet xmlhttprequest cors

收到此错误消息: 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);

            }
        }
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?标题中我缺少什么使这个CORS请求有效?

我尝试删除了receiveReq.setRequestHeader("Origin", ...)通话,但谷歌Chrome在我的receiveReq.open()通话中抛出了访问错误...

为什么?

Bri*_*n S 14

这只是一个猜测,因为我使用jquery来处理ajax请求,包括CORS.

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

尝试请求而不设置这些标头,看看浏览器是否为您设置了它们.


MeT*_*TeO 9

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

Access-Control-Allow-Origin: *
Run Code Online (Sandbox Code Playgroud)

请注意,Chrome对"localhost"主机名的限制非常严格.(至少是在我使用它的时候).而是使用您的计算机名称或在"hosts"文件中为其指定另一个别名.例如,不要访问您的网站,例如:

http://localhost:port/myappname
Run Code Online (Sandbox Code Playgroud)

而是使用:

http://mymachinename:port/myappname
Run Code Online (Sandbox Code Playgroud)

要么

http://mymachinealias:port/myappname
Run Code Online (Sandbox Code Playgroud)

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