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

时间:2011-12-16 18:11:11

标签: jquery ajax post header

我正在查询使用自定义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.');
  }
});

这是firebug标题输出:

  

选项 / service HTTP / 1.1   主持人:server.com   User-Agent: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   Accept-Language:en-us,en; q = 0.5   Accept-Encoding:gzip,deflate   Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.7   连接:保持活力   来源:null   访问控制请求方法:POST   访问控制请求标头:custom-header-key   Pragma:没有缓存   缓存控制:无缓存

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

  

POST / service HTTP / 1.1   主持人:server.com   User-Agent: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   Accept-Language:en-us,en; q = 0.5   Accept-Encoding:gzip,deflate   Accept-Charset:ISO-8859-1,utf-8; q = 0.7,*; q = 0.7   连接:保持活力    CUSTOM-HEADER-KEY:CUSTOM-HEADER-VALUE   Pragma:没有缓存   缓存控制:无缓存   内容长度:0

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

有人可以帮我吗?

4 个答案:

答案 0 :(得分:5)

在跨域请求中,如果服务浏览器不允许标头,则只需将其删除

首先,浏览器浏览器会进行OPTION调用以检查是否允许(Origin,Headers,Methods)

在您的服务配置中,您必须允许标头才能使用

将其发送到服务器
Access-Control-Allow-Headers: YOUR_HEADER_NAME

答案 1 :(得分:2)

这是跨域请求。所以你无法从浏览器端解决它。您可能需要服务器端代理才能对其他域执行POST。

答案 2 :(得分:1)

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

$.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.');
  }
});

答案 3 :(得分:1)

跨域调用上的任何自定义标头都会触发一个OPTIONS调用之前的请求。您需要绕过OPTIONS调用的安全检查或单独处理请求,因为自定义标头未通过OPTIONS请求传递。允许飞行前请求也没有坏处,因为没有实际数据通过该调用传递回浏览器。基本上,浏览器会询问服务器是否允许在实际制作之前拨打该电话。您可能还需要检查Access-Control标头。所有这些更改都在服务器端btw,因此您需要完全控制Web服务。