【问题标题】:setRequestHeader does not work in JSONP using jQuerysetRequestHeader 在使用 jQuery 的 JSONP 中不起作用
【发布时间】:2012-05-19 18:46:40
【问题描述】:

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

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

这是我的功能:

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,我认为我们不需要在那里进行更改,但任何想法都会有所帮助

提前致谢

【问题讨论】:

    标签: jquery jsonp restful-authentication basic-authentication


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,现在我真的明白 JSONP 是如何工作的了,是的,这是一个跨域调用,这就是为什么我需要使用 JSONP :-(
    【解决方案2】:

    正如jfriend00 所说,

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

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

    【讨论】:

    • 我猜那么setRequestHeader不能和JSONP调用一起去,所以我用了注入方法,效果很好,谢谢大家的帮助
    • URL 将是 user:pass@example.com 在 IE 浏览器中是不允许的 support.microsoft.com/en-in/kb/834489 ,您有什么建议如何在不传递 URL 的情况下获取 jsonp 的标头身份验证?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 2013-04-27
    相关资源
    最近更新 更多