有效的会话超时和pipe理
有没有办法使用Angularjspipe理用户会话?我的意思是::
- 会话超时 – 系统空闲时。
- 会话即将到期时发出警报,并select恢复会话。
- 如果会话已过期,则尝试发出请求时redirect(或任何其他操作)。
拦截器可以解决这个问题吗? 你能提供一个例子吗?
提前致谢。
尝试空闲 。 这是一个简单的组件,您可以在达到超时之前设置超时和警告时间。 然后你可以查询服务器的用户注销或类似的东西。
myApp.config(function(IdleProvider, KeepaliveProvider) { IdleProvider.idle(900); // 15 min IdleProvider.timeout(60); KeepaliveProvider.interval(600); // heartbeat every 10 min KeepaliveProvider.http('/api/heartbeat'); // URL that makes sure session is alive }); myApp.run(function($rootScope, Idle) { Idle.watch(); $rootScope.$on('IdleStart', function() { /* Display modal warning or sth */ }); $rootScope.$on('IdleTimeout', function() { /* Logout user */ }); });
在上述configuration中,当用户闲置900秒(不移动鼠标,按任何键或button等),警告正在显示。 然后等待60秒,然后注销用户(发送请求到可能破坏服务器会话的服务器)。
为了确保服务器会话不会过期(即使用户正在做的所有事情都在移动鼠标), Keepalive
服务将每隔10分钟向服务器发送一个请求。 这个时间必须less于服务器会话到期时间。
结帐演示 。
这里有一些实现:
https://github.com/witoldsz/angular-http-auth
https://github.com/angular-app/angular-app/tree/master/client/src/common/security
我现在一直在使用ng-idle来满足以下要求。
我们的要求是当用户闲置60分钟。 55分钟后显示popup确认框,说你想继续你的会议与否(我用甜蜜的警报)。 如果用户点击继续,则重置空闲时间,否则通过调用广播方法强制退出。
当用户在下面的app.config里面login时,configuration必须在app.js中完成
app.config(['KeepaliveProvider', 'IdleProvider', function (KeepaliveProvider, IdleProvider) { IdleProvider.idle(TimeOut.firstAPiCall);--It will call Idle On method IdleProvider.timeout(TimeOut.SessionTimeOut);--It will be called when the total time is (TimeOut.firstAPiCall +TimeOut.SessionTimeOut) KeepaliveProvider.interval(TimeOut.interval);}]) --It will be called like a heart beat for mentioned timeout until the idle start has not occured.
以下是显示popup窗口的代码
$scope.$on('IdleStart', function () { $scope.$broadcast('SessionIdleUpdate', 'IdleStart', TimeOut.FirstApicall); $rootScope.idleTimerSession = setTimeout(function () { console.log("pop up appeared on : " + new Date()) $scope.timedout = SweetAlert.swal({ title: "Alert", text: "Your session is about to expire in 5 minutes, Do you want to continue?", type: "warning", showCancelButton: true, confirmButtonColor: "#DDDDD", confirmButtonText: "CONTINUE", cancelButtonText: "No" }, function (isConfirm) { if (isConfirm) { clearTimeout(idleTimer); } else { console.log("pop up closed from confirm on : " + new Date()) $scope.$broadcast('SessionTimeOutLogOut', null); Idle.unwatch(); $scope.started = false; } }); //This check is to handle idle pop up if it appears and user doesnt perform any action it will simply logout. var idleTimer = setTimeout(function () { swal.close(); $scope.$broadcast('SessionTimeOutLogOut', null); Idle.unwatch(); $scope.timedout = null; }, (TimeOut.sessionTimeOut) * 1000); }, (TimeOut.idleTimeOut - TimeOut.idleCheckDuration) * 1000);-- Time out is added to hold the pop up for that much duration . Because once the idle start is occured you wont be able to call the API });
以下是处理空闲结束事件的代码:
$scope.$on('IdleEnd', function () { $scope.$broadcast('SessionIdleUpdate', 'IdleEnd', 0)); clearTimeout($rootScope.idleTimerSession); closeModals(); });
下面是Time Out的代码,它将在以后调用(TimeOut.firstAPiCall + TimeOut.SessionTimeOut)
$scope.$on('IdleTimeout', function (forceLogout) { swal.close(); $scope.$broadcast('SessionTimeOutLogOut', null); Idle.unwatch(); });