Chrome 在重定向时取消 CORS XHR

Posted

技术标签:

【中文标题】Chrome 在重定向时取消 CORS XHR【英文标题】:Chrome cancels CORS XHR when redirected 【发布时间】:2013-09-09 16:43:54 【问题描述】:

我遇到了一个神秘问题,Chrome 在遇到 HTTP 重定向时会取消跨域 AJAX 请求。在“网络”选项卡中,它显示为“(已取消)”,并且响应标头或正文不可用。

流程如下:

    在 http:// 上加载页面 在 https:// 上向登录端点发送 POST 请求 303 响应 请求已取消。

这是 JS(来自ajaxtest.html):

var r = new XMLHttpRequest();
r.open('POST', 'https://dev.example.com/appName-rest/login', true);
r.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
r.send(JSON.stringify("username":"myusername","password":"myrealpassword"));
r.send();

Chrome 的网络内部显示服务器使用以下标头进行响应:

HTTP/1.1 303 See Other
Date: Thu, 05 Sep 2013 17:54:21 GMT
Server: Apache/2
Access-Control-Allow-Origin: http://dev.example.com
Access-Control-Allow-Credentials: true
Location: https://dev.example.com/appName-rest/j_spring_cas_security_check?ticket=xxxx.example.com
Vary: Accept-Encoding,User-Agent
Content-Encoding: gzip
Content-Length: 52
Connection: close
Content-Type: text/plain; charset=UTF-8

它说:URL_REQUEST_BLOCKED_ON_DELEGATE

有人知道为什么会失败吗?

【问题讨论】:

你在使用WebService吗? 不确定.. 我想是的。但代码只是普通的 javascript 【参考方案1】:

似乎您正在尝试执行Cross-Origin Request with Preflight,因为您设置了“Content-Type”:“application/json”。带有重定向的预检请求被 CORS specs 拒绝。

【讨论】:

【参考方案2】:

你发送了两次这个方法:r.send();

请尝试以下方法

    var xhr = new XMLHttpRequest();
    xhr.open("POST", "YOUR_URL", true);
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

    xhr.onreadystatechange = function (event) 
        if (xhr.readyState === 4 && xhr.status === 200)  // if complete and success
            return xhr.responseText;
        
    ;
    xhr.withCredentials = true; // OPTIONAL : I don't know if you need it for CORS Requests
    xhr.send("username=YOUR_USERNAME&password=YOUR_PASSWORD");

【讨论】:

以上是关于Chrome 在重定向时取消 CORS XHR的主要内容,如果未能解决你的问题,请参考以下文章

如何保护 Django 中的静态 HTML 文件? (重定向前需要登录)

AngularJS 和 Laravel - 跨域 CORS / XHR 请求缺少(记住)cookie

在Chrome中取消了飞行前OPTIONS请求(已支持CORS)

CORS withCredentials XHR 预检未在 Firefox 中发布 Cookie

Xampp over Lan - CSS/JS 在重定向到本地主机时无法正常工作

为啥 CORS 标头不被视为 XHR 调用的一部分?