La Classe Session
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:
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à
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:
Dove item è l'indice dell'array corrispondente all'informazione che si desidera recuperare. Per esempio, per recuperare l'ID di sessione si dovrà fare:
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:
Dove $array è un array contenente le nuove informazioni. Per esempio:
Se si vuole aggiungere un solo valore alla volta, set_userdata() supporta anche la seguente sintassi:
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');
E' possibile passare anche un array con gli oggetti da rimuovere:
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:
E' possibile passare un array alla funzione set_flashdata(), allo stesso modo di set_userdata().
Per leggere le variabili flash:
Se si necessita di salvare i valori flashdata per una ulteriore richiesta al server, questo è possibile attraverso la funzione keep_flashdata().
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:
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:
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:
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 )



