2013-05-22 10 views
35

वहाँ AngularJS का उपयोग कर उपयोगकर्ता सत्र प्रबंधन करने के लिए कोई तरीका है ?, मेरा मतलब है ::कोणीय सत्र टाइमआउट और प्रबंधन

  • सत्र समय समाप्ति - जब सिस्टम बेकार है।
  • सत्र फिर से शुरू करने के विकल्प के साथ समाप्ति के करीब होने पर अलर्ट।
  • सत्र समाप्त होने पर अनुरोध करने का प्रयास करते समय रीडायरेक्ट (या कोई अन्य कार्रवाई)।

इस समस्या को हल करने के लिए इंटरसेप्टर एक अच्छा विकल्प हो सकता है? क्या आप एक उदाहरण प्रदान कर सकते हैं?

अग्रिम धन्यवाद।

उत्तर

49

ng-idle की कोशिश करो। यह एक साधारण घटक है जहां आप टाइमआउट पहुंचने से पहले टाइमआउट और चेतावनी समय निर्धारित कर सकते हैं। फिर आप उपयोगकर्ता लॉगआउट या कुछ समान के लिए सर्वर से पूछ सकते हैं।

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 */ }); 
}); 

ऊपर विन्यास में, जब उपयोगकर्ता 900s के लिए निष्क्रिय है (माउस को स्थानांतरित नहीं करता है, किसी भी कुंजी या बटन आदि प्रेस), चेतावनी प्रदर्शित किया जा रहा है। इसके बाद यह 60 के दशक का इंतजार करेगा और उपयोगकर्ता को लॉग आउट करेगा (सर्वर पर अनुरोध भेजें जो संभवतः सर्वर सत्र को नष्ट कर देगा)।

यह सुनिश्चित करने के लिए कि सर्वर सत्र समाप्त नहीं होता है (भले ही उपयोगकर्ता जो भी कर रहा है वह माउस चल रहा है) Keepalive सेवा हर 10 मिनट में सर्वर से अनुरोध भेजेगी। इस बार सर्वर सत्र समाप्ति समय से कम होना है।

demo चेकआउट करें।

+2

+1 एक अच्छा स्पष्टीकरण देने और वर्तमान वाक्यविन्यास का उपयोग करने के लिए +1 - 'निष्क्रिय' पर कॉल जोड़ने के लिए संपादित किया गया।'रन()' फ़ंक्शन में देखें() 'अन्यथा टाइमर शुरू नहीं होगा और निष्क्रिय घटनाएं आग नहीं जाएंगी। – Boris

+0

@ बोरीस, धन्यवाद। आपका संपादन अस्वीकार कर दिया गया है इसलिए मैंने इसे स्वयं जोड़ा है। – fracz

+0

संपादन जोड़ने के लिए धन्यवाद। कोई विचार क्यों इसे खारिज कर दिया गया? यह निश्चित रूप से 'घड़ी()' के बिना मेरे लिए काम नहीं करता है और दूसरों को भी यह समस्या हो रही है। – Boris

1

मैं अब कुछ समय के लिए एनजी-निष्क्रिय का उपयोग कर रहा हूं।

हमारी आवश्यकता तब थी जब उपयोगकर्ता 60 मिनट के लिए निष्क्रिय हो। 55 मिनट के बाद पुष्टिकरण बॉक्स के साथ पॉप अप दिखाते हुए कहते हैं कि क्या आप अपना सत्र जारी रखना चाहते हैं या नहीं (मैंने मीठी चेतावनी का उपयोग किया है)। यदि उपयोगकर्ता जारी रखने पर क्लिक करता है तो निष्क्रिय समय को रीसेट कर दें और प्रसारण विधि को कॉल करके बलपूर्वक लॉग आउट करें।

विन्यास app.js में किया जाना है जब उपयोगकर्ता लॉग-इन app.config अंदर की तरह नीचे

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. 

नीचे दिखा पॉप-अप

$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(); 
}); 

नीचे समय के लिए कोड है इसके बाद इसे कॉल किया जाएगा - - (TimeOut.firstapiCall + TimeOut.SessionTimeOut)

$scope.$on('IdleTimeout', function (forceLogout) { 


     swal.close(); 
     $scope.$broadcast('SessionTimeOutLogOut', null); 
     Idle.unwatch(); 

}); 
संबंधित मुद्दे