setRequestHeader在使用jQuery的JSONP中不起作用

我正在使用jQuery Mobile,jQuery 1.7.2和PhoneGap构建iPhone应用程序

尝试使用此代码从ASP.NET RESTful Web服务获取JSONP,我需要首先进行身份validation并获取令牌,然后再将其发回。

这是我的function:

var setToken = function () { var serverToken = ''; $.support.cors = true; jQuery('body').ajaxSend(function (evt, xhr) { xhr.setRequestHeader("Authorization", "Basic " + $.base64.encode(username + ":" + password)); xhr.setRequestHeader('X-Accept', 'application/json'); }); $.getJSON(url + "?jsoncallback=?", null, function (res) { console.log(res); serverToken = res.Token; }); $('body').ajaxSend(function (evt, xhr, ajaxOptions) { xhr.setRequestHeader('NewToken', serverToken); }); }; 

我得到401(未经授权)检查标题:

 Request URL:http://192.168.0.44/call/?jsoncallback=jQuery17206244203052483243499_132336710607307&_=1336742104278 Request Method:GET Status Code:401 Unauthorized Request Headers Accept:*/* Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en;q=0.8 Connection:keep-alive Host:192.168.0.44 Referer:http://localhost/myMobileApp/ User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19 Query String Parametersview URL encoded jsoncallback:jQuery17206244203052483243499_132336710607307 _:1336710704278 Response Headers Access-Control-Allow-Origin:* Cache-Control:private Content-Length:0 Date:Fri, 11 May 2012 04:31:52 GMT Server:Microsoft-IIS/7.5 WWW-Authenticate:Basic X-AspNetMvc-Version:3.0 X-Powered-By:ASP.NET 

setRequestHeader没有添加标题。

我究竟做错了什么?

请记住,服务器端已经设置为返回JSONP,我认为我们不需要在那里进行更改,但任何想法都会有所帮助

提前致谢

正如jfriend00所说,

JSONP请求不使用实际的ajax调用,您可以在其中控制HTTP请求。

但是在您的情况下 – 您尝试添加的标头是基本授权 – 您可以将其注入URL,就像您“通常”那样。 因此,要在http://example.com上使用用户“user”和密码“pass”进行身份validation,URL将为http:// user:pass@example.com/ 。

JSONP请求不使用实际的ajax调用,您可以在其中控制http请求。

相反,它会在页面中注入脚本标记,然后浏览器会请求脚本src文件。 返回的结果脚本执行并通过javascript执行(调用回调函数)传回它的结果。 由于请求是通过脚本标记插入生成的,而不是直接的ajax调用,因此无法在JSONP请求上设置请求标头。

如果您的请求是跨域的,那么JSONP是您唯一的机制。

如果您的请求与页面(不是跨域)的原点相同,那么您可以将请求重组为实际的ajax调用,以返回JSON数据。 如果您这样做,您可以在ajax调用上设置请求标头。