【问题标题】:ajaxSetup (beforeSend not workingajaxSetup(之前发送不工作
【发布时间】:2013-10-14 13:55:33
【问题描述】:

登录远程 API 服务器并获得 access_token 后,我尝试为所有后续 ajax 调用设置授权标头:

      .done(function (result) {
         console.log("GOT AUTHORIZATION");
         amplify.store( "tokens", { access_token: result.access_token, refresh_token: result.refresh_token, token_type: result.token_type, expires_in: result.expires_in });
         var authorization = 'Bearer ' + amplify.store( "tokens" ).access_token;
         console.log(authorization);

         $.ajaxSetup({
             beforeSend: function(xhr) {
                 xhr.setRequestHeader('Authorization', authorization);
             }
         });

在控制台上我可以看到:

GOT AUTHORIZATION login.js:34
Bearer 6b7578772fbb4178793100651f2234de840237fe

但后续的 ajax 调用都没有获得正确的标头集:

https://macmini.local:8000/Categories?_=1381758170726 

无法成功,因为在标头(服务器控制台..)中找不到 access_token

{ code: 400,
   error: 'invalid_request',
   error_description: 'The access token was not found',stack: undefined }
saveAccessToken: 6b7578772fbb4178793100651f2234de840237fe, client_id: 1234567890, user_id: 1

我尝试修改 ajax 调用中的标头 wo 任何成功

【问题讨论】:

    标签: jquery ajax header


    【解决方案1】:

    更新答案

    从 jQuery 1.5 开始,.ajax 支持 headers 属性

    $.ajax({
        url: "http://fiddle.jshell.net/favicon.png",
        headers: {
            'Authorization': authorization
        }
    })
    .done(function( data ) {
        if ( console && console.log ) {
            console.log( "Sample of data:", data.slice( 0, 100 ) );
        }
    });
    

    注意:authorization 变量应在此调用之前设置


    旧答案

    $(function(){
        $.ajaxSetup({
            beforeSend: function(xhr) {
                     xhr.setRequestHeader('Authorization', authorization);
                 }
        });
    });
    

    要使ajaxSetup 工作,您需要在 document.ready 中调用它。

    【讨论】:

    • 谢谢......它是这样工作的......我还发现了如何让 beforeSend 在 ajax 调用块内工作......我忘了添加:async:false .. $.ajax( 'macMini.local:8000/Categories', { type: "GET", cache: false, async: false, dataType: "json", beforeSend: function (xhr, settings){ xhr.setRequestHeader('Authorization', 'Bearer' + amplify.商店(“令牌”).access_token);}})
    • 这可能已经过时了,现在你可以直接在 $.ajax() 中设置“headers”属性
    • @MonoThreaded 更新了答案,感谢您向我指出这一点。没有你,我不会注意到这一点。
    【解决方案2】:

    我知道这是一个老问题,但我从 Google 来到这里,并认为其他搜索相同内容的人应该有一个可行的解决方案。我已经尝试了建议的答案,但它对我不起作用。

    解决我的问题的解决方案是直接在$.ajaxSend 内部的xhr 对象中设置标题:

    $(document).ajaxSend(function(ev, xhr, settings) {
      xhr.setRequestHeader('Authorization', `Bearer ${localStorage.getItem(AUTH_TOKEN)}`);
      xhr.setRequestHeader('X-Marketplace', localStorage.getItem('marketplace'));
    });
    

    您应该在document.ready 中调用它,以使ajaxSend 起作用。

    类似的question 帮助了我。

    【讨论】:

      猜你喜欢
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      • 2011-08-30
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多