Login
Libri
Home Le Classi La Classe Session

La Classe Session

Share

La Classe Session permette di conservare lo "stato" dell'utente e tracciare la sua attività mentre naviga nel vostro sito. La Classe Session memorizza le informazioni della sessione come una lista di dati in un cookie. Per aggiungere maggiore sicurezza è possibile anche salvare i dati della sessione in una tabella di un database, questo permette di confrontare l'ID di sessione presente nel cookie dell'utente con quello salvato nel Database. Di default solo i cookies vengono salvati. Se si sceglie di usare un db è necessario creare una tabella nella quale verranno archiviate tutte le informazioni della sessione, come descritto sotto.

Importante: La classe Session non utilizza le sessioni native di PHP, ma genera delle proprie informazioni relative alle sessioni. Ciò garantisce maggiore flessibilità per gli sviluppatori.

Inizializzare una sessione

Le sessioni generalmente si attivano ogni qual volta una pagina viene caricata, quindi la classe session dovrà necessariamente essere inizializzata in un controller, oppure potrà essere aggiunta alle classi in "autoloaded" nella configurazione dell'applicazione. Per la maggior parte la classe session lavorerà in background così, semplicemente con l'inizializzazione della classe si potranno leggere, creare e aggiornare le sessioni.

Per inizializzare la classe Session manualmente in un controller sarà necessario usare la funzione $this->load->library:

 $this->load->library('session'); 

Una volta carica, l'oggetto Sessions potrà essere disponibile utilizzando: $this->session

Come funziona la classe Sessions?

Quando una pagina è caricata, la classe session verificherà se esisto dati di sessione validi nei cookie. Se i dati non esistono (oppure se sono scaduti) verrà creata una nuova sessione e salvata in un cookie. Se una sessione esiste le informazioni che contiene verranno aggiornati così come il cookie. Ad ogni aggiornamento il session_id verrà rigenerato.

E' importante capire che una volta inizializzate, la classe Session funzionerà automaticamente. Non c'è altro da fare. Potrai, come vedrai di seguito, lavorare con i dati delle sessioni o aggiungere tuoi dati, ma il processo di lettura, scrittura e aggiornamento di una sessione è automatico.

Che cosa sono i Dati di Sessione?

Una sessione, per quanto concerne CI, è semplicemente un array contenente le seguenti informazioni:

  • il Session ID dell'utente, univoco (è una stringa generata randomicamente, criptata con MD5, che si rigenera(di default) ogni 5 minuti);
  • l'indirizzo IP dell'utente;
  • I dati relativi all'Agent dell'utente (una stringa composta dai primi 50 caratteri del browser)
  • la data e ora dell'ultima attività
I dati sopra sono memorizzati in un cookie come un array con questo modello:
 
[array]
{
'session_id'    => random hash,
'ip_address'   =>'string - user IP Address',
'user_agent'  =>'string - user agent data',
'last_activity'  => timestamp 
}<code>
</code>

Se è stata abilitata l'opzione di encryption, l'array sarà criptato prima di essere salvato nel cookie, rendendo i dati sicuri e protetti da chiunque li voglia leggere o modificare.

Nota: i cookies di sessione sono aggiornati solo ogni 5 minuti di default, per ridurre il processo di caricamento. Se si aggiorna ripetutamente una pagina, si noterà che solo "last activity" verrà aggiornato se 5 o più minuti non sono passiti dal momento che è stato scritto il cookie l'ultima volta. Questo intervallo di tempo è configurabile cambiando il $config['time_to_update'] nel file  system/config/config.php.

Recuperare le informazioni della Session

E' possibile recuperare qualsiasi informazione salvata nell'array della sessione usando la seguente funzione:

$this->session->userdata('item');

Dove item è l'indice dell'array corrispondente all'informazione che si desidera recuperare. Per esempio, per recuperare l'ID di sessione si dovrà fare:

$session_id = $this->session->userdata('session_id');

Nota: La funzione ritornerà FALSE(booleano) se l'oggetto al quale cerchiamo di accedere non esiste.

Aggiungere propri dati di Sessione

Un aspetto utile dell'array di sessione è la possibilità di aggiungervi proprio dati che verranno memorizzati all'interno del cookie dell'utente. Perché fare una cosa del genere? Per esempio:

Diciamo di voler creare un particolare user log per un sito. Una volta avvenuta l'autenticazione, si potrebbe aggiungere username e email al cookie di sessione, facendo così si renderà diponibile queste informazioni all'appicazione a livello globale, senza quindi la necessità di ricorrere a query sul db.

Per aggiungere una nuova informazione all'array di sessione sarà sufficiente passargli un array contenente i nuovi dati con la seguente funzione:

$this->session->set_userdata($array);

Dove $array è un array contenente le nuove informazioni. Per esempio:

$newdata = array(
'username' => 'johndoe',
'email' => '
 Questo indirizzo e-mail è protetto dallo spam bot. Abilita Javascript per vederlo.
 ',
'logged_in' => TRUE
);
$this->session->set_userdta($newdata);

Se si vuole aggiungere un solo valore alla volta, set_userdata() supporta anche la seguente sintassi:

$this->session->set_userdata('some_name' ,'some_value');

Nota: Cookies possono contenere solo 4KB di dati, è necessario stare attenti a non superare questa soglia. Il processo di encryption in particolare produce stringhe più lunghe dei dati originali, monitorate quindi la grandezza dei cookies per non incorrere in errori.

Cancellare dati di Sessione

Proprio come set_userdata() può essere usatao per aggiungere dati nelle sessioni, così unset_userdata() può rimuoverle, passandogli la chiave di sessione. Per esempio, se si vuole rimuovere 'some_name' dalle informazioni di sessione:

$this->session->unset_userdata('some_name');

$this->session->unset_userdata('some_name');

E' possibile passare anche un array con gli oggetti da rimuovere:

$array_items = array('username' => '', 'email' =>'');
$this->session->unset_userdata($array_items);

Flashdata

CodeIgniter supporta "flashdata", o informazioni di sessione che saranno disponibili solo per la successiva richiesta al server, e poi saranno cancellate automaticamente. Queste possono essere molto utili, e tipicamente sono usati per informare o messaggi di status. (per esempio: "cancellati 2 records").

Nota: le variabili Flash sono precedute dal prefisso "falsh_", così è bene evitarlo nelle variabili di sessione.

Per aggiungere dati flash:

$this->session->set_flashdata('nome', 'valore');

E' possibile passare un array alla funzione set_flashdata(), allo stesso modo  di set_userdata().

Per leggere le variabili flash:

$this->session->flashdata('nome');

Se si necessita di salvare i valori flashdata per una ulteriore richiesta al server, questo è possibile attraverso la funzione keep_flashdata().

 

$this->session->keep_flashdata('nome');

Salvare Dati di Sessione in un Database

Benché i dati di sessione siano salvati in un array all'interno di un cookie contenente un ID di Sessione, a meno che i dati di sessione non vengano salvati in un database, non ci sono possibilità di validarlo. Per alcune applicazioni che necessitano di un basso o nessun livello di sicurezza, la validazione del Session ID potrebbe non essere necessario, ma se l'applicazione richiede sicurezza, una validazione è abbligatoria.

Quando i dati di sessione sono disponibili in un database, ogni volta che una sessione valida viene trovata nei cookie dell'utente, viene eseguita una query per confrontare i valori. Se l'Id di sessione non corrispondono, la sessione viene distrutta. Gli ID di sessione non possono mai essere aggiurnati, possono solo essere generati quando una nuova sessione viene creata.

Al fine di memorizzare le sessioni, sarà necessario creare una tabella nel database a tale scopo. Di seguito un prototipo (per MySQL) richiesto dalla classe Session:

Nota: Di default la tabella è chiamata ci_sessions, ma può essere chiamata in qualunque modo si voglia basta che venga aggiornato il nome nel file application/config/config.php. Una volta creata la tabella sarà possibile abilitara l'opzione "database"  nel config.php, come di seguito:

$config['sess_use_database'] = TRUE;

Una volta abilitata, la classe Session memorizzerà tutte le informazioni di sessione nel DB.

Verificate che sia specificata il nome della tebella nel file di configurazione:

$config['sess_table_name'] ='ci_sessions';

Nota: La classe Session contiene già una procedura che cancella i dati una volta che la sessione scade.

Distruggere una Sessione

Per cancellare la sessione corrente:

$this->session->sess_destroy();

Nota: Questa funzione dovrebbe essere chiamata come ultima, dopo anche le variabili flash non saranno più disponibili. Se si vuole cancellare solo una variabile, non tutte, allora sarà possibile utilizzare la funzione unset_userdata().

Preferenze di Sessione

I valori per configurare le Session nel file application/config/config.php sono:

Preference Default Options Description
sess_cookie_name ci_session None Il nome con il quale si vuole venga salvato il cookie di
sess_expiration 7200 None Il numero di secondi oltre il quale la sessione è considerata scaduta. Di default il valore è impostato a 2 ore (7200 secondi). Se non si vuole che le sessioni scadano è possibile impostare il valore zero: 0
sess_encrypt_cookie FALSE TRUE/FALSE (boolean) Se si vuole crittografare le informazioni.
sess_use_database FALSE TRUE/FALSE (boolean) Se si vuole salvare i dati della sessione nel database. E' necessario creare la tabella prima di abilitare questa opzione.
sess_table_name ci_sessions Any valid SQL table name Il nome della tabella nel db nel quale verranno salvati i dati di sessione.
sess_time_to_update 300 Time in seconds Questa opzione controlla quanto spesso la classe Session creerà un nuovo session id.
sess_match_ip FALSE TRUE/FALSE (boolean) Confronta se l'indirizzo IP dell'utente è uguale a quello presente nei dati di sessione. Nota che alcuni ISP cambiano l'IP dinamicamente, così, se non si vuole che la sessione scada è necessario impstare a FALSE questo parametro.
sess_match_useragent TRUE TRUE/FALSE (boolean) Confronta se User Agent del browser è uguale a quello presente nei dati di sessione.

Ultimo aggiornamento ( Mercoledì 20 Gennaio 2010 12:47 )