2

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

这是流程:

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

这是 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

有谁知道为什么会失败?

4

2 回答 2

3

似乎您正在尝试使用 Preflight 进行跨域请求,因为您设置了 'Content-Type': 'application/json'。带有重定向的预检请求被CORS 规范拒绝。

于 2015-06-22T15:06:08.277 回答
0

你发送了两次这个方法: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");
于 2013-09-05T22:18:48.843 回答