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 服务中检索相同的标头值?
Spring MVC过滤器获取自定义jquery ajax标头