当使用 Google Chrome 的 xmlHttpRequest 时,拒绝设置不安全的头部"Origin"。

34

收到以下错误信息:

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() 调用的访问错误...

为什么会这样?

3个回答

30

这只是一个猜测,因为我在使用jQuery进行ajax请求时,包括CORS。

我认为应该由浏览器设置此标头,而不是您自己设置。如果您能够设置标头,那么这将使安全功能失效。

尝试不设置这些标头来发起请求,看看浏览器是否会为您设置它们。


1
是的:只需删除设置请求头“Origin”的代码-对我来说非常有效! - Tim Lovell-Smith

21

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

Access-Control-Allow-Origin: *

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

http://localhost:port/myappname

改为使用:

http://mymachinename:port/myappname
或者
http://mymachinealias:port/myappname

欲了解更多细节,请查看规范


非常感谢您的评论,它对我很有帮助。我只是用 http://127.0.0.1:port/myappname 替换了 http://localhost:port/myappname。 - Toundrake

-11
你是在进行跨域工作吗?
尝试使用Brian S的解决方案或者尝试这个:
不要设置为localhost,只需传递任何内容... 然后看看会发生什么。
receiveReq.setRequestHeader("Origin", "*");

7
拒绝设置不安全的标头“Origin”。 - Mikael Lindqvist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接