浏览器在 ajax 请求上发送 Origin 标头,但不是通过简单的 HTTP Get 请求。为啥?

Posted

技术标签:

【中文标题】浏览器在 ajax 请求上发送 Origin 标头,但不是通过简单的 HTTP Get 请求。为啥?【英文标题】:Browsers send Origin header on ajax requests, but not with simple HTTP Get request. Why?浏览器在 ajax 请求上发送 Origin 标头,但不是通过简单的 HTTP Get 请求。为什么? 【发布时间】:2012-12-05 19:08:19 【问题描述】:

我使用 SignalR 作为我的推送服务器(.NET 的东西),并且在这个过程中的某个地方,脚本发送了一个 ajax 请求,但不发送 cookie。

但是,当我在新选项卡中打开该请求时,所有 cookie 都会同时发送。

注意事项:

    X-Requested-With没有定义(代码是$.ajax(),但是好像浏览器认为这个请求是跨域请求) 推送服务器在domain.com:7171上运行 应用服务器正在domain.com 上运行 URL 使用GET 方法 当我们从地址栏向同一个 URL 发送一个简单的请求(简单的 HTTP Get)时,cookie 会被发送

为什么 cookie 在 HTTP get 请求时发送到同一个 URL,而在 ajax 请求时不发送?

【问题讨论】:

【参考方案1】:

您提到这是从 domain.com 到 domain.com:7171 的跨域请求。默认情况下,跨域请求中不包含 Cookie。您需要通过设置.withCredentials = true;in your JQuery request 明确表明您想要包含cookie。您的服务器还需要使用标题 Access-Control-Allow-Credentials: true 进行响应。你可以在这里了解更多:http://www.html5rocks.com/en/tutorials/cors/

【讨论】:

以上是关于浏览器在 ajax 请求上发送 Origin 标头,但不是通过简单的 HTTP Get 请求。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Django 向浏览器发送响应它收到此错误:请求的资源上不存在“Access-Control-Allow-Origin”标头

如何设置 Origin 请求标头

Ajax跨域问题的两种解决方法

获取请求未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头

Jquery AJAX:请求的资源上不存在“Access-Control-Allow-Origin”标头

请求的资源上不存在“Access-Control-Allow-Origin”标头-Mollie payment ajax