在Firefox中使用自定义标头的Javascript Dojo AJAX(XHR)请求

时间:2010-01-28 20:26:13

标签: javascript ajax firefox dojo xmlhttprequest

我正在尝试使用dojo.xhrGet发出请求从服务器获取一些XML数据。我正在使用dojo 1.4.0。

服务器要求我通过名为Myauthtoken的自定义HTTP标头传递凭据。

在Safari中一切正常。代码会弹出一个显示[object Document]的对话框。但在Firefox中,对话框显示null。在整个过程中,自定义标头被删除或损坏,服务器不接受它。

相关代码如下所示:

dojo.xhrGet({
  url: 'https://host.com/path/to/thing?param1=one&param2=two',
  headers: {
    'Myauthtoken': 'username:password'
  },
  handleAs: 'xml',
  load: function(response) {
    alert(response);
  },
  error: function(e) {
    alert("error: " + e);
  }
});

在Firefox中,Firebug显示以下请求标头:

  

主持人: host.com
  用户代理: Mozilla / 5.0(Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.7)Gecko / 20091221 Firefox / 3.5.7
  接受: text / html,application / xhtml + xml,application / xml; q = 0.9, / ; q = 0.8
  接受语言: en-us,en; q = 0.5
  接受编码: gzip,deflate
   Accept-Charset: ISO-8859-1,utf-8; q = 0.7,*; q = 0.7
  保持活力: 300
  连接:保持活力
  原产地: null
  访问控制 - 请求 - 方法: GET
  访问控制请求标头: myauthtoken,x-requested-with

服务器响应403(禁止)和这些响应标题:

  

日期:周四,2010年1月28日20:02:47 GMT
  服务器: Noelios-Restlet-Engine / 1.0.6
  内容类型: text / html;字符集= ISO-8859-1
  内容长度:337
  连接:关闭


更新! 我一直在研究,看起来问题是Firefox正在尝试preflight the request because of the custom headers,而Safari不是,而只是发送自定义标头而不先检查它们是否有效。

我也想出了how to look at the Request in Safari

  

缓存控制: max-age = 0
  内容类型: application / x-www-form-urlencoded
   Myauthtoken:用户名:密码
  用户代理: Mozilla / 5.0(Macintosh; U; Intel Mac OS X 10_5_8; zh-CN)AppleWebKit / 531.21.8(KHTML,类似Gecko)版本/ 4.0.4 Safari / 531.21.10

响应标题:

  

缓存控制:无存储
  连接:关闭
  内容长度: 236391
  内容类型: application / xml;字符集= ISO-8859-1
  日期:周五,2010年1月29日23:02:22 GMT
  服务器: Noelios-Restlet-Engine / 1.0.6

主要区别在于Content-Length: 235391

不幸的是,我仍然没有更接近实际找到解决方案 - 仍然在寻找一些好的想法,或者根本没有任何想法。

对于发生了什么以及如何解决这个问题的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:2)

经过一番研究后,看起来问题是服务器期望标题区分大小写,而Firefox正在将标题转换为小写。

Firefox正在发送myauthtoken,而服务器正在发送Myauthtoken

最后,我们使用的是getFirstValue(String name)的一些代码,它默认为区分大小写,而不是getFirstValue(String name, boolean ignoreCase)

注意区分大小写的标题!

答案 1 :(得分:0)

对于自定义标头,我认为您需要使用X-前缀:

  
    

X-Myauthtoken:用户名:密码

  
  headers: {
    'X-Myauthtoken': 'username:password'
  },

服务器也需要接受它,因为它是非标准的标题。