博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
angularjs给Model添加拦截过滤器,路由增加限制,实现用户登录状态判断
阅读量:4130 次
发布时间:2019-05-25

本文共 2223 字,大约阅读时间需要 7 分钟。

使用angularjs的但页面应用时,由于是本地路由在控制页面跳转,但是有的时候我们需要判断用户是否登录来判断用户是否能进入界面。

angularjs是mvc架构所以实现起来很容易也很灵活,我们只MainController里增加一个路由事件侦听并判断,这样就可以避免未登录用户直接输入路由地址来跳转到登录界面地址了

代码中的 $rootScope.user是登录后把用户信息放到了全局rootScope上,方便其他地方使用,$rootScope.defaultPage也是默认主页面,初始化的时候写死到rootScope里的。

1 2 3 4 5 6 7 8
$rootScope.$on('$stateChangeStart',function(event, toState, toParams, fromState, fromParams){
if(toState.name=='login')return;// 如果是进入登录界面则允许 // 如果用户不存在 if(!$rootScope.user || !$rootScope.user.token){
event.preventDefault();// 取消默认跳转行为 $state.go("login",{from:fromState.name,w:'notLogin'});//跳转到登录界面 } });

另外还有用户已经登录,但是登录超时了,还有就是增加后台接口的判断来增强安全性。不能完全依靠本地逻辑

我们在model里面增加一个用户拦截器,在rensponseError中判断错误码,抛出事件让Contoller或view来处理

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
app.factory('UserInterceptor', ["$q","$rootScope",function ($q,$rootScope) {
return {
request:function(config){
config.headers["TOKEN"] = $rootScope.user.token; return config; }, responseError: function (response) {
var data = response.data; // 判断错误码,如果是未登录 if(data["errorCode"] == "500999"){
// 清空用户本地token存储的信息,如果 $rootScope.user = {token:""}; // 全局事件,方便其他view获取该事件,并给以相应的提示或处理 $rootScope.$emit("userIntercepted","notLogin",response); } // 如果是登录超时 if(data["errorCode"] == "500998"){
$rootScope.$emit("userIntercepted","sessionOut",response); } return $q.reject(response); } }; }]);

别忘了要注册拦截器到angularjs的config中哦

1 2 3
app.config(function ($httpProvider) {
$httpProvider.interceptors.push('UserInterceptor'); });

最后在controller中处理错误事件

1 2 3 4
$rootScope.$on('userIntercepted',function(errorType){
// 跳转到登录界面,这里我记录了一个from,这样可以在登录后自动跳转到未登录之前的那个界面 $state.go("login",{from:$state.current.name,w:errorType}); });

最后还可以在loginController中做更多的细节处理

1 2 3 4 5
// 如果用户已经登录了,则立即跳转到一个默认主页上去,无需再登录 if($rootScope.user.token){
$state.go($rootScope.defaultPage); return; }

另外在登录成功回调后还可以跳转到上一次界面,也就是上面记录的from

1 2
var from = $stateParams["from"]; $state.go(from && from != "login" ? from : $rootScope.defaultPage);

转载地址:http://axbvi.baihongyu.com/

你可能感兴趣的文章
后台服务的变慢排查思路(轻量级应用服务器中测试)
查看>>
MySQL中InnoDB事务的默认隔离级别测试
查看>>
微服务的注册与发现
查看>>
bash: service: command not found
查看>>
linux Crontab 使用 --定时任务
查看>>
shell编程----目录操作(文件夹)
查看>>
机器学习-----K近邻算法
查看>>
HBASE安装和简单测试
查看>>
关于程序员的59条搞笑但却真实无比的编程语录
查看>>
搞笑--一篇有趣的文章编译自一篇西班牙博客。有一位美丽的公主,被关押在一个城堡中最高的塔上,一条凶恶的巨龙看守着她,需要有一位勇士营救她…
查看>>
非常不错 Hadoop 的HDFS (Hadoop集群(第8期)_HDFS初探之旅)
查看>>
Tomcat启动错误,端口占用
查看>>
laravel 修改api返回默认的异常处理
查看>>
高德坐标转换百度坐标 javascript
查看>>
tp5封装通用的修改某列值
查看>>
laravel控制器与模型名称不统一
查看>>
vue登录拦截
查看>>
npm配置淘宝镜像仓库以及electron镜像
查看>>
linux设置开机自启动脚本的最佳方式
查看>>
VUE SPA 单页面应用 微信oauth网页授权
查看>>