• 在Angular中,如果权限值是异步请求所得,如何将其设置为HTTP请求头的Authorization?


    遇到此问题的背景:项目需要实现单点登录,在前后端分离的前提下,前台如何保存token值成为了一个问题。想到的解决方案是,将token值统一存到一个前端程序,其他的前端程序去这个前端程序去取token(其他更好的解决方案欢迎指导~~)。在项目用angular的情况下,选择了以下插件:angular-cross-storage,此插件可以实现跨域存取localStorage,操作非常简单,都有demo。

    通常情况下,设置HTTP的authorization只需在congfig中进行如下配置:

    var app = angular.module("myApp",[]); 
    app.config(function($httpProvider) { 
      $httpProvider.defaults.headers.common["Authorization"] = 所需带的权限;
    });

    但是在此处,权限值是存在另一个前端程序的token值,获取权限token值是异步请求,并不能确定在何时能完成,说不定还没得到token值,页面已经发出了http请求,而这个没设置Authorization的请求,势必会返回401。

    So 先要设置一个拦截器,并在拦截器里设置请求头,代码如下:

        var app = angular.module("myApp",[
            'angular-cross-storage'
        ]);
     // 拦截器服务
       app.factory("HttpInterceptor", function ($q, tokenService) {
            var HttpInterceptor = {
                request: function(config){
                    var deferred = $q.defer();
                    tokenService.getTokenEvents().then(function(res) {  // 从另一个前端程序获取token
                        config.headers["Authorization"] = "bearer " + res.value; // 设置Authorization
                        deferred.resolve(config);
                    }).catch(function (err) {
                        // do something...
                        deferred.resolve(config);
                    });
                    return deferred.promise;
     
                },
                requestError: function(err){
                    return $q.reject(err);
                },
                response: function(res){
                    console.log(res);
                    return res;
                },
                responseError: function(err){
                    if(-1 === err.status) {
                        console.log(-1);
                        // 远程服务器无响应
                    } else if(500 === err.status) {
                        // 处理各类自定义错误
                    } else if(401 === err.status) {
                         
                    }
                    return $q.reject(err);
                }
            };
            return HttpInterceptor;
        }

     拦截器依赖一个对token操作的服务“tokenService", 代码如下:

    // token的存取及清除
       app.factory("tokenService", function (CrossDomainStorage) {  // CrossDomainStorage 是angular-cross-storage 的一个服务
            var setToken = function (access_token) {
                return CrossDomainStorage.set("access_token",access_token)
            };
            var setTokenType = function (token_type) {
                return CrossDomainStorage.set("token_type", token_type)
            };
            var getToken = function () {
                return CrossDomainStorage.get('access_token')
            };
            var clearToken = function () {
                return CrossDomainStorage.clear()
            };
            return {
                setTokenEvents: function (access_token) {
                    return setToken(access_token)
                },
                setTokenTypeEvents: function (token_type) {
                    return setTokenType(token_type)
                },
                getTokenEvents: function () {
                    return getToken();
                },
                clearTokenEvents: function () {
                    return clearToken();
                }
            }
        })

     然后在config中配置拦截器, 代码如下:

    app.config(function ($httpProvider,CrossDomainStorageProvider) {
            $httpProvider.interceptors.push('HttpInterceptor');
        })

     就大功告成了,页面发起的请求都会带上 从另一前端程序取过来的 token值权限头。

  • 相关阅读:
    Java反射得到属性的值和设置属性的值
    想建一个比较严格的自律打卡监督群,群主真的会很较真
    JS面向对象篇四、原型链与继承(多种继承实现方式及其利弊分析)
    JS面向对象篇三、创建对象的几种方法
    JS面向对象篇二、什么是原型?原型对象与实例对象、构造函数的关系及相关方法
    JS面向对象篇一、理解对象及属性特性(属性描述符)
    javascript作用域篇一、什么是javascript作用域链
    javascript函数篇四、函数的属性和方法——apply()、call()和bind()方法区别
    javascript函数篇三、函数声明提升
    javascript函数篇二、深入理解为什么javascript中没有函数重载
  • 原文地址:https://www.cnblogs.com/sloane/p/6438999.html
Copyright © 2020-2023  润新知