使用 Google Chrome 的 xmlHttpRequest 时拒绝设置不安全的标头“Origin”

Posted

技术标签:

【中文标题】使用 Google Chrome 的 xmlHttpRequest 时拒绝设置不安全的标头“Origin”【英文标题】:Refused to set unsafe header "Origin" when using xmlHttpRequest of Google Chrome 【发布时间】:2012-06-26 07:37:19 【问题描述】:

收到此错误消息: 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", ...) 调用,但随后谷歌浏览器在我的receiveReq.open() 调用中引发访问错误...

为什么?

【问题讨论】:

【参考方案1】:

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

Access-Control-Allow-Origin: *

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

http://localhost:port/myappname

改为使用:

http://mymachinename:port/myappname

http://mymachinealias:port/myappname

更多详情请查看specification。

【讨论】:

【参考方案2】:

你是在跨域工作吗?

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

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

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

【讨论】:

拒绝设置不安全的标头“Origin”【参考方案3】:

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

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

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

【讨论】:

是的:只需删除设置请求标头“Origin”的代码 - 对我来说非常有用!

以上是关于使用 Google Chrome 的 xmlHttpRequest 时拒绝设置不安全的标头“Origin”的主要内容,如果未能解决你的问题,请参考以下文章

解决ubuntu无法使用root用户启动Google Chrome浏览器

google chrome使用的插件不受支持怎么办?

在 React 中使用 Firebase 进行 Google 登录以进行 chrome 扩展

使用“返回”按钮时,Google 协作平台小工具在 Chrome 上消失

使用 Google 字体的 Chrome 上的 CORS 错误

将 jQuery 与 Google Chrome 应用程序而非 Chrome 扩展程序一起使用