16

我有一个通过 ajax 提交的表单。我正在使用 jquery 表单插件。我想要做的是获取从我的服务器返回的“位置”标头。我可以在萤火虫中看到它。但是每当我在成功回调中调用 getResponseHeader() 函数时,它总是返回“未定义”。

代码:

form.ajaxForm({
  dataType: 'xml',
  data: {format: 'xml'},
  resetForm: true,
  success: function(xml,status,xhr){
    var location = xhr.getResponseHeader('Location');
    alert(location);
  });

位置未定义。但我可以在萤火虫中看到“位置”标题。我错过了什么?即使我从 xhr 对象调用 getAllResponseHeaders(),它也会返回“未定义”

4

3 回答 3

35

如果这是一个CORS 请求xhr.getResponseHeader('Header'),您可能会在调试工具(例如 Chrome->Inspect Element->Network)中看到所有标头,但如果此类标头是简单的响应标头,xHR 对象只会检索标头(通过) :

  • Content-Type
  • Last-modified
  • Content-Language
  • Cache-Control
  • Expires
  • Pragma

如果不在此集合中,则它必须存在于服务器返回的Access-Control-Expose-Headers标头中。

关于所讨论的情况,如果它是一个 CORS 请求,则只有当且仅当以下标头也存在时,才能Location通过对象检索标头:XMLHttpRequest

Access-Control-Expose-Headers: Location

如果它不是 CORS 请求,XMLHttpRequest则检索它没有问题。

于 2013-03-16T00:59:24.577 回答
6

XMLHttpRequest 将透明地遵循重定向,因此最终请求将没有标头,它已经遵循该重定向,并且您会看到该请求的响应标头而不是具有标头的初始请求Location)。

于 2010-12-06T19:10:15.527 回答
4

我正在使用 rails/rest 方法将带有 Location 标头的 201“已创建”返回到新对象和一个空主体。jQuery 的 ajax 方法在遇到这种情况时会抛出一个“parseerror”,因为它期望 json 但什么也得不到。我只是在我的错误回调中捕获 201 重定向,如下所示:

function request_error(req, textStatus, errorThrown) 
{
    if (req.status == 201 ) {
        var created_loc = req.getResponseHeader('Location');
        console.log('(201) created: ' + created_loc);

        // ... manual redirect here i.e. issue another ajax request to created_loc
        return;
    }

    // ... handle an actual error here
}

希望这可以帮助!

于 2011-02-28T19:07:18.050 回答