2013-05-30 22 views
5

Ho visto molte domande qui sul mio argomento ma sembra che non abbia ancora trovato la mia risposta. Quello che sto cercando è quando la sessione scade, l'utente verrà automaticamente reindirizzato a una pagina che dice .Scade automaticamente la sessione e rileva se la sessione è scaduta in Codeigniter

In realtà non ho idea di come sia possibile determinare se la sessione dell'utente è già scaduta. Ecco cosa ho finora.

Grazie.

function trial() { 

    $this->db->select()->from('user')->where('user_type', 'tester'); 
    $tester = $this->db->get(); 

    foreach ($tester->result() as $row) { 

     $data = array(
      'id' => $row->id, 
      'first_name' => $row->first_name, 
      'last_name' => $row->last_name, 
      'display_name' => $row->display_name, 
      'email' => $row->email, 
      'avatar' => $row->avatar, 
      'user_type' => $row->user_type, 
      'logged_in' => TRUE 
     ); 
     $this->session->set_userdata($data); 
    } 

    redirect(base_url(), 'refresh'); 
} 

risposta

1

è possibile memorizzare i dati in oggetto della sessione e l'utente reindirizzare qualsiasi pagina, è possibile controllare oggetto di sessione già esistere se non esiste si può mostrare avviso, la sessione è scaduta

1

Sebbene non affidabile al 100%, è possibile impostare un cookie sul computer degli utenti. Consiglierei di impostare la scadenza circa un'ora prima.

Con ogni pagina che si desidera sapere se la sessione è scaduta, è possibile controllare se sia il cookie sia la sessione esistessero. Se lo fa ... continua. Se rimane solo il cookie, allora sai che la sessione è scaduta e devi reindirizzare la pagina a cui hai fatto riferimento nella tua domanda. Se nessuno dei due è presente, allora c'è un problema e l'utente deve riavviare tutto.

Ovviamente, per ogni pagina creata per l'istanza di una sessione, la scadenza della sessione verrà riavviata, quindi sarà necessario reimpostare il cookie. Potrebbe essere un po 'noioso, ma è quello che consiglierei.

+0

C'è comunque per me di farlo nel controller? –

6

È possibile controllare la sessione di utente che effettua la chiamata ajax e avvolgerlo nella funzione setIntervaljquery's come

setInterval(function() { 
    // Do something every 1 minute 
$.ajax({ 
type : 'POST', 
url : '<?php echo site_url("CONTROLLERNAME/check_session")?>' 
success : function(data){ 
if(data){ 
    //your session is not expired 
}else{ 
    //your session is already expired 
window.location.href="your url"; // or you can redirect from here also 
} 
}); 
}, 60000); 


//This function checks your session 
function check_session(){ 
    $id = $this->session->userdata('id'); 
    if($id){ 
     echo 1; 
    }else{ 
     echo 0; 
    redirect('your register controller');//redirect from here or you can redirect in the ajax response 
    } 

    die(); 
} 

Speranza ha senso

+0

questa è una tecnica divina, ma cosa succede se l'utente ha disattivato JavaScript? Ho bisogno di una soluzione che funziona senza javascript – Smith

+0

So che questo argomento è già vecchio ma, a beneficio degli altri come me, uso la risposta sopra con piccole modifiche. Se non vuoi usare 'js' puoi usare metadati come questo,' " /> ', che ho visto in un altro sito. Inseriscilo nel tag ''. Il 'content =" 900; 'è il tempo in secondi seguito da' url = 'Che contiene il metodo di logout, nel mio caso, controller separato. altri in futuro, ma il '.ajax' sopra è quello per me. grazie – Markmeplease

+0

@Markmeplease' content = "900; url = ', il numero' 900' è in millisecondi o secondo? – Gagantous

0

Quando si avvia la sessione, memorizzare l'ora corrente a una variabile di sessione. È possibile utilizzare una funzione session_expire_checker che controllerà l'ora corrente e il tempo memorizzato per determinare se la sessione è scaduta. Dovresti chiamare la funzione dal costruttore in modo che ogni chiamata di funzione userà automaticamente questa funzione. In quella funzione se la sessione è scaduta, si reindirizza a un altro controller.

È necessario utilizzare un controller separato per l'URL reindirizzato, altrimenti ci sarebbe un reindirizzamento infinito.

0

Codeigniter non "scatta un evento" quando la sessione scade. Quindi, o si scrive un codice in ogni funzione di controllo per verificare se l'utente è ancora connesso o si utilizzano alcuni piccoli js nel piè di pagina (che personalmente preferisco):.

<script> 
    var mins = 15 * 60; 
    var active = setTimeout("logout()",(mins*1000)); 
    function logout() 
    { 
     location='/account/timeout'; // <-- put your controller function here to destroy the session object and redirect the user to the login page. 
    } 
</script> 
Problemi correlati