首页 文章

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

提问于
浏览
7

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

如果我执行没有 Headers 的POST我得到了预期的错误,但是当我添加 Headers 时,我得到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标头输出:

OPTIONS / 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 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连接:keep-alive原始:null Access-Control-Request-Method:POST Access-Control-Request-Headers:custom-header-key Pragma:no-cache Cache-Control:no-cache

和海报一起执行帖子时的smae Headers ,返回所需的结果 .

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 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连接:keep-alive CUSTOM-HEADER-KEY:CUSTOM-HEADER-VALUE Pragma:no-cache Cache-Control:no-cache Content-Length:0

差异非常明显,但我不知道我在jquery代码中做错了什么 .

有人可以帮帮我吗?

4 回答

  • 1

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

    首先,浏览器浏览器将进行OPTION调用以检查允许的内容(Origin,Headers,Methods)

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

    Access-Control-Allow-Headers: YOUR_HEADER_NAME
    
  • 5

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

  • 2

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

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

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

相关问题