jquery $.ajax 自定义 http 标头问题

Posted

技术标签:

【中文标题】jquery $.ajax 自定义 http 标头问题【英文标题】:jquery $.ajax custom http headers issue 【发布时间】:2012-01-22 05:23:55 【问题描述】:

我正在查询一个使用自定义 http 标头进行身份验证的 REST Web 服务。

如果我在没有标头的情况下执行 POST,我会收到预期的错误,但是当我添加标头时,我会收到 404 错误,而不是我实际需要的错误。

这是我的代码

$.ajax(
  type: 'POST',
  url: 'http://server.com/service',
  beforeSend: function (xhr)  xhr.setRequestHeader('CUSTOM-HEADER-KEY', 'CUSTOM-HEADER-VALUE') ,
  success: function(data)     
    alert('success.');
  
);

这是萤火虫标头输出:

选项 /service HTTP/1.1 主机:server.com 用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0.1) Gecko/20100101 Firefox/8.0.1 接受:text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 接受语言:en-us,en;q=0.5 接受编码:gzip,放气 接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.7 连接:保持活动 产地:无 访问控制请求方法:POST 访问控制请求标头:自定义标头键 Pragma:无缓存 缓存控制:无缓存

以及使用海报执行帖子时的 smae 标头,返回所需的结果。

POST /service HTTP/1.1 主机:server.com 用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0.1) Gecko/20100101 Firefox/8.0.1 接受:text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 接受语言:en-us,en;q=0.5 接受编码:gzip,放气 接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.7 连接:保持活动 CUSTOM-HEADER-KEY:CUSTOM-HEADER-VALUE Pragma:无缓存 缓存控制:无缓存 内容长度:0

区别很明显,但我不知道我在jquery代码中做错了什么。

谁能帮帮我?

【问题讨论】:

您是否正在跨服务器发送此 POST 请求? Blender 走上了正轨。这很可能是沙盒违规。通过 jsonp 访问服务或使用您的服务器作为服务的代理。 “和 smae 标头在执行带有海报的帖子时”.. 什么是“海报”? 【参考方案1】:

在跨域请求中,如果服务浏览器不允许标头将简单地删除它

首先浏览器浏览器会进行一个 OPTION 调用来检查允许的(来源、标题、方法)

在您的服务配置中,您必须允许标头才能使用将其发送到服务器

Access-Control-Allow-Headers: YOUR_HEADER_NAME

【讨论】:

【参考方案2】:

跨域调用的任何自定义标头都会触发一个飞行前请求,该请求是一个 OPTIONS 调用。您需要绕过对 OPTIONS 调用的安全检查或单独处理请求,因为自定义标头不会随 OPTIONS 请求一起传递。此外,允许飞行前请求也没有什么害处,因为没有实际数据通过该调用传回浏览器。基本上,浏览器会在实际进行调用之前询问服务器是否允许进行该调用。您可能还需要检查您的访问控制标头。顺便说一句,所有这些更改都在服务器端,因此您需要完全控制 Web 服务。

【讨论】:

从 CORS 的角度来看,即使理解在 OPTIONS 上发送客户标头也没有任何意义...您知道是否有在 OPTIONS 请求中添加客户标头的技巧或解决方法? 我说您的自定义标头不会随 OPTIONS 请求一起发送。它基本上是一个简单的请求,询问是否允许在此路径上执行 POST、PUT 等操作。不,没有将任何自定义标头添加到 OPTIONS 调用的解决方法,浏览器不允许将此作为​​安全措施。您始终可以使用 JSONP 绕过 CORS 限制,但您必须使用查询参数将任何数据传递到服务器,因为它只是一个 【参考方案3】:

这是一个跨域请求。所以你不能从浏览器端解决它。您可能需要一个服务器端代理来执行 POST 到不同的域。

【讨论】:

【参考方案4】:

这可能有帮助,也可能没有帮助,但我认为您可以在数据选项中添加标题:

$.ajax(
  type: 'POST',
  data: put the results of your header request here,
  url: 'http://server.com/service',
  beforeSend: function (xhr)  xhr.setRequestHeader('CUSTOM-HEADER-KEY', 'CUSTOM-HEADER-VALUE') ,
  success: function(data)     
    alert('success.');
  
);

【讨论】:

以上是关于jquery $.ajax 自定义 http 标头问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jquery Ajax 发送自定义标头并使用 C# 在 WCF 服务中检索相同的标头值?

AJAX 使用 CORS 获取自定义响应标头

jQuery Ajax 访问自定义响应标头

Spring MVC过滤器获取自定义jquery ajax标头

带有自定义标头的跨域 jquery ajax api 调用未命中服务器

具有自定义标头和请求正文作为 JSON 字符串的跨域 jquery ajax 请求