2010-05-11 4 views

Répondre

1

Ajouté ce script en vue: `

if(isSessionAlive >0) 
{ 
    var timer = { 
     time: 0, 
     now: function(){ return (new Date()).getTime(); }, 
     start: function(){ this.time = this.now(); }, 
     since: function(){ return this.now()-this.time; } 
    } 
    var timerId; 
    sess_expiration = <?=($this->config->config["sess_expiration"]*1000)?>; 
    alertTime = <?=($this->config->config["sess_time_to_alert"])?>; 
    timerId  = window.setTimeout("pingCI()",sess_expiration-((alertTime*1000))); 
    jsBaseurl = "<?=($this->config->config["base_url"])?>"; 

} 
function resetTimer(resetTime) 
{ 
    //alert('RESET Time'+resetTime); 
    window.clearTimeout(timerId); 
    timerId = window.setTimeout("pingCI()", resetTime); 
    return; 
} 
function pingCI() 
{ 
    if(isSessionAlive > 0) 
    { 
      $.ajax({ 
       type: "POST", 
       url: "<?= site_url('users/getSessionTimeLeft') ?>/", 
       data: "sessid=<?=$this->session->userdata("session_id")?>", 
       success: function(transport) 
       { 
        response = transport; 

        if(response=='') 
        { 
         parent.location.assign(jsBaseurl+'users/logout'); 
        } 
        else if((response<=(alertTime*1000)) || (response-1000<=(alertTime*1000))) 
        { 
         alertSessionTimeOut(response); 
        } 
        else 
        { 
         resetTime = eval((response - alertTime)*1000); 
         resetTimer(resetTime); 
        } 
       } 
      }); 
    } 
} 
function alertSessionTimeOut(alertTimeExp) 
{ 
    if(isSessionAlive>0) 
    { 
     var response=''; 
     var timerIdEnd; 

     timerAlert = window.setTimeout("forceLogout()",alertTimeExp*1000); 
     timer.start(); // start counting my friend... 


     fConfirm = confirm('Your Session is about to time out. Please click OK to continue the session'); 
     if(timer.since() >= (alertTime*1000)) 
     { 
      parent.location.assign(jsBaseurl+'users/logout'); 
     } 
     if(fConfirm ==true) 
     { 
       $.ajax({ 
        type: "POST", 
        url: "<?= site_url('users/keepAlive') ?>/", 
        data: "sessid=<?=$this->session->userdata("session_id")?>", 
        success: function(transport) 
        { 
         response = transport; 
         if(response=='') 
         { 
          parent.location.assign(jsBaseurl+'users/logout'); 
         } 
         window.clearTimeout(timerAlert); 
         resetTimer(sess_expiration-((alertTime)*1000)); 
        } 
       }); 
     } 
     else 
     { 
      //parent.location.assign(jsBaseurl+'users/logout'); 
      window.clearTimeout(timerAlert); 
      window.clearTimeout(timerId); 

     } 
    } 
} 

function forceLogout() 
{ 
    parent.location.assign(jsBaseurl+'users/logout'); 
} 

Et Les utilisateurs Contrôleur:

function getSessionTimeLeft() 
    { 
    $ci = & get_instance(); 
    $SessTimeLeft = 0; 
    $SessExpTime  = $ci->config->config["sess_expiration"]; 
    $CurrTime  = time(); 
    $lastActivity = $this->session->userdata['last_activity']; 
    $SessTimeLeft = ($SessExpTime - ($CurrTime - $lastActivity))*1000; 
    print $SessTimeLeft; 
} 

function keepAlive() 
{ 
    $this->load->library('session'); 
    $this->session->set_userdata(array('last_activity'=>time())); 
    if(isset($this->session->userdata["user_id"])) print 'ALIVE'; 
    else print ''; 
} 

`

0
  1. Une façon est de stocker dans un javascript variable, le temps restant et mettre à jour la variable dans chaque page de rafraîchissement

  2. Créer une fonction javascript avec un settimeout qui vérifie la valeur de la variable que vous définissez en 1.)

Cordialement,
Pedro

1

dépend de ce que exactement vous voulez réaliser. Lorsque quelqu'un utilise plusieurs onglets/fenêtres, une fenêtre peut rester ouverte très longtemps sans que la session expire. Les opérations AJAX compliquent encore les choses. Si vous voulez des notifications précises, vous devrez configurer une minuterie, et quand elle se déclenche, vérifiez via une requête AJAX (en prenant soin de ne pas renouveler la session) si l'estimation est toujours exacte.

2

Étant donné que la session sera actualisée dès que vous revenez côté serveur et que le script appelle session_start(), vous devez vraiment le faire en Javascript. Toutefois, si l'utilisateur a deux fenêtres de navigateur ouvertes avec une session fractionnée et qu'une session est inactive, alors que l'utilisateur génère encore du trafic avec l'autre, le javascript dans la fenêtre inactive signale de manière incorrecte que la session était sur le point d'expirer. Vous devez donc implémenter votre propre gestionnaire ajax pour détecter l'âge de la session sans appeler session_start().

Quelque chose comme:

$session_id=$_REQUEST[session_name()]; 
// if you use the default handler: 
$session_last_access=filemtime(session_save_path() . '/' . $session_id); 
$time_left=time() + session_cache_expire() - $session_last_access; 

C.

Questions connexes