• Non ci sono risultati.

MODULO 1

N/A
N/A
Protected

Academic year: 2021

Condividi "MODULO 1"

Copied!
9
0
0

Testo completo

(1)

MODULO 1

PARTE 3

Programmazione (scripting) server-side con PHP

3.c

Goy - a.a. 2009/2010 Programmazione Web 1

3.c

Cookies e sessioni

Cookie - I

Cookie = informazioni che il server scrive in un file di testo

che viene salvato sul client

(per es, su Windows XP, con Firefox 2 vengono salvati in: C:\Documents and Settings\user\Dati applicazioni\Mozilla\

Firefox\Profiles\h83by28b.default\cookies.txt

• Per utilizzarli è necessario che il client "accetti" i cookies

• Per utilizzarli è necessario che il client accetti i cookies

⇒ è possibile modificare la configurazione del browser!

Per es, con Firefox 2: Strumenti→ Opzioni → Privacy → Avanzate

• L'utente può cancellarli!

P Fi f 2

Goy - a.a. 2009/2010 Programmazione Web 2

Per es, con Firefox 2:

Strumenti→ Elimina dati personali

⇒ non sono un metodo tanto

affidabile per mantenere

informazioni importanti…

(2)

Cookie - II

Un cookie, generalmente, contiene:

• il nome del cookie

• un valore

• un identificativo del server che lo ha prodotto

• una data di scadenza

NB: Un server può leggere solo i cookies che lui stesso ha scritto! (il controllo viene effettuato grazie all’id del server contenuto nel cookie)

Goy - a.a. 2009/2010 Programmazione Web 3

PHP: cookie - I

E' possibile scrivere e leggere cookie utilizzando PHP Per scrivere un cookie, utilizzo la funzione predefinita setcookie(…):

nome del cookie

restituisce la data corrente (misurata in secondi dalla Unix Epoch: 1/1/1970)

setcookie( "punti" , "10", time() + 2592000, ...);

Per leggere un cookie utilizzo l’array associativo

$_COOKIE[]

:

$puntiAccum = $_COOKIE["punti"];

nome del cookie

valore (opzionale) scadenza del cookie (opzionale):

a 30 gg (2.592.000 sec) da oggi

Goy - a.a. 2009/2010 Programmazione Web 4

Attenzione! I cookie sono inviati nell'intestazione (header) di HTTP response ⇒ bisogna invocare la funzione

setcookie(…) prima che il contenuto (body) venga generato, cioè all’inizio della pagina (prima di qualunque altra cosa…

prima del tag

<HTML>

per es..)!!!

(3)

PHP: cookie - II

Per es, chiediamo all'utente nome, cognome e colore preferito;

scriviamo queste informazioni in un 3 cookies; poi leggiamo le informazioni dai cookie e personalizziamo la pagina Nel file

es-cookie html

:

VEDI es-cookie.html

Nel file

es-cookie.html

:

<FORM METHOD="POST" ACTION="personalCookie1.php" >

Nome: <INPUT TYPE="TEXT" NAME="nome"/><BR>

Cognome: <INPUT TYPE="TEXT" NAME="cognome"/><BR><BR>

Quale colore di sfondo preferisci?

<SELECT NAME="colore">

<OPTION VALUE="#FFFFFF">bianco</OPTION>

<OPTION VALUE="#FFFF00">giallo</OPTION>

<OPTION VALUE="#FF0000">rosso</OPTION>

#00 66 /

Goy - a.a. 2009/2010 Programmazione Web 5

<OPTION VALUE="#00FF66">verde</OPTION>

<OPTION VALUE="#00FFFF">azzurro</OPTION>

</SELECT>

<BR><BR>

<INPUT TYPE="Submit" VALUE="OK"/>

</FORM>

PHP: cookie - III

Nel file

personalCookie1.php

(scrittura di un cookie):

<?php

$n = $_POST["nome"];

$cn = $_POST["cognome"];

$ $

VEDI personalCookie1.php

$col = $_POST["colore"];

setcookie("nome", $n, time()+2592000);

setcookie("cogn", $nc, time()+2592000);

setcookie("sfondo", $col, time()+2592000);

?>

...

<P ALIGN='CENTER'>

Ho scritto tre cookie con le seguenti informazioni:

<?php

Goy - a.a. 2009/2010 Programmazione Web 6

echo "<BR>Nome = " . $n;

echo "<BR>Cognome = " . $cn;

echo "<BR>Colore di sfondo preferito = " . $col;

...

?>

</P>

(4)

PHP: cookie - IV

Chiudiamo il browser, lo riapriamo (simulando così una nuova sessione di lavoro...) e ci connettiamo a personalCookie2.php Nel file

personalCookie2.php

(lettura di un cookie):

<?php

VEDI personalCookie2.php

p p

$nome = $_COOKIE["nome"];

$cognome = $_COOKIE["cogn"];

$sfondo = $_COOKIE["sfondo"];

echo "<BODY BGCOLOR=$sfondo>";

?>

...

<P ALIGN='CENTER'>

<?php

echo "Buongiorno " $nome " " $cognome "!";

Goy - a.a. 2009/2010 Programmazione Web 7

echo Buongiorno . $nome . . $cognome . ! ; echo "<BR>Ti piace questo sfondo ($sfondo)?";

?>

</P>

PHP: sessioni - I

sito web

utente1 utente2 utente3 sessione1

sessione2 sessione3

Sessione = serie di accessi ad un sito web, effettuati da uno stesso client, in un arco di tempo delimitato, durante il quale viene

t t t t d ll'i t i

¾ Inizio di una sessione: il Web Server crea automaticamente un oggetto session, con ID univoco, per ogni client che si connette al sito web

¾ Fine di una sessione:

– quando scade (timeout) → vedi php.ini:

session gc maxlifetime = 1440[secondi]

ecc… ecc…

mantenuto uno stato dell'interazione

Goy - a.a. 2009/2010 Programmazione Web 8

session.gc_maxlifetime = 1440[secondi]

– quando viene eseguito il seguente script PHP:

session_unset();

session_destroy();

– quando viene chiuso il browser

resetta le variabili di sessione[vedi lucidi succ.]

distrugge l'oggetto session

(5)

PHP: sessioni - II

session_start();

→ funzione PHP che verifica se l'utente ha già un sessionID (cioè se c'è già una sessione attiva per quell'utente): se non lo trova ne crea uno, altrimenti recupera i dati sullo stato della sessione attiva p

NB: anche se è controintuitivo,

session_start()

deve essere invocata ogni volta che si vuole accedere a informazioni sulla sessione!

Attenzione!

La funzione

session_start()

invia al client delle informazioni nell'intestazione (header) di HTTP response

Goy - a.a. 2009/2010 Programmazione Web 9

( ) p

⇒ bisogna invocare la funzione

session_start()

prima che il contenuto (body) di HTTP response venga generato, cioè all’inizio della pagina (prima di qualunque altra cosa, anche di uno spazio bianco)!!!

PHP: sessioni - III

Se non lo facciamo, per es:

<HTML>

...

<?php

session start();_ ();

...

Otteniamo un messaggio di errore (warning = errore non grave) del tipo:

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\xampp\htdocs\corsoPW\php\provaSessione2.php:13) in C:\xampp\htdocs\corsoPW\php\provaSessione2.php on line 41

Goy - a.a. 2009/2010 Programmazione Web 10

C:\xampp\htdocs\corsoPW\php\provaSessione2.php on line 41

che ci dice appunto che non può inviare un session cookie

perché l’intestazione (header) è già stata inviata (la riga 41 è

appunto quella in cui viene – erroneamente – invocata

session_start())

(6)

PHP: sessioni - IV

Ma perché?!?

Per gestire la sessione PHP ha a disposizione 2 meccanismi:

1. cookie

2. URL rewriting

Vi ricordate? Le operazioni sui cookies vengono fatte tramite l'intestazione (header) di HTTP response

⇒ per questo la funzione session_start() (che utilizza il meccanismo dei cookies per scrivere e leggere il sessionID) deve essere invocata prima che il contenuto (body) di HTTP response venga generato, cioè all’inizio della pagina (prima di qualunque altra cosa anche di uno spazio bianco)

Goy - a.a. 2009/2010 Programmazione Web 11

(prima di qualunque altra cosa, anche di uno spazio bianco) Ma se l'utente ha disattivato i cookies sul suo browser le sessioni non funzionano?!? In questo caso PHP utilizza il secondo meccanismo, l'URL rewriting...

PHP: sessioni - V

Se i cookies sono stati disattivati, PHP (

session_start()

) scrive il sessionID come parametro degli URL nella pagina Per es. se nella pagina vi è un link:

<A HREF="adduser.php">

L'i t t l tit i

L'interprete lo sostituisce con:

<A HREF="adduser.php?PHPSESSID=68cf093a2ec5aa4f6cb60">

NB: Per abilitare questa possibilità è necessario configurare le proprietà seguenti in php.ini:

session.use_trans_sid = 1

session.use_only_cookies = 0 (o commentata)

Nota:

L i f i i ll i ( i ID )

Goy - a.a. 2009/2010 Programmazione Web 12

Le informazioni sulla sessione (sessionID, ecc.) vengono salvate (sul server) nella cartella indicata nel file php.ini:

session.save_path = "${path}\tmp\"

⇒ la cartella tmp, sotto C:\Programmi\EasyPHP 2.0b1\ deve

esistere ed essere scrivibile!

(7)

PHP: sessioni – variabili di sessione - I

Tutti i dati relativi alla sessione (stato dell'interazione) vengono caricati da PHP nell'array associativo

$_SESSION

In particolare l'array associativo

$_SESSION

contiene le variabili di sessione

Le variabili di sessione sono variabili "globali al sito", cioè accessibili (visibili) da tutte le pagine del sito, all'interno di una sessione (a differenza delle variabili "normali" la cui visibilità è limitata alla singola pagina)

Con PHP, possiamo dichiarare e inizializzare una variabile di sessione, per es:

leggo lo username (da

Goy - a.a. 2009/2010 Programmazione Web 13

session_start();

...

$_SESSION["user"] = $_POST["login"];

leggo lo username (da un form di login, per es...)

lo scrivo in una variabile di sessione

PHP: sessioni – variabili di sessione - II

In tutte le pagine successive (visitate dopo aver inizializzato la variabile di sessione) sarà possibile leggerne il valore

NB: se questo non è possibile, significa che la sessione è scaduta!

Per es:

session_start();

...

if ( isset($_SESSION["user"]) ) { //sessione valida

...

$_SESSION["user"]

...

funzione che restituisce true se la variabile (passata come parametro)

Goy - a.a. 2009/2010 Programmazione Web 14

...

} else

//sessione scaduta ...

}

esiste (ed è stata inizializzata),

false altrimenti

(8)

PHP: sessioni – var. di sessione - III

Esempio:

provaSessione1.html

→ form di login

<INPUT TYPE="TEXT" NAME="login"/>

provaSessione2.php

→ scrivo in una nuova variabile di

VEDI provaSessione1.html VEDI provaSessione2.php VEDI provaSessione3.php

sessione (user) il login dell'utente

$_SESSION["user"]=$_POST["login"];

provaSessione3.php

→ leggo la variabile di sessione user (la stampo), invoco le funzioni

session_unset();

session_destroy();

e poi controllo che abbiano fatto il loro lavoro!

Goy - a.a. 2009/2010 Programmazione Web 15

echo "USER esiste ancora? ";

if (isset($_SESSION["user"])) { echo "Sì";

} else {

echo "No";

}

PHP: sessioni – variabili di sessione - IV

⇒ possiamo usare le variabili di sessione per due scopi principali:

1) per controllare gli accessi

2) per rendere delle informazioni disponibili nelle pagine successive

1) Controllo degli accessi:

– login → inizializzo una variabile di sessione

– pagine successive → se la variabile è "settata", allora la sessione è valida; se non lo è, significa che la sessione è scaduta

⇒ se l'utente cerca di accedere ad una pagina del sito d l l i l i bil di i

Goy - a.a. 2009/2010 Programmazione Web 16

senza passare dal login, la variabile di sessione non

verrà settata e l'accesso sarà impossibile!

(9)

PHP: sessioni – variabili di sessione - V

2) Rendere informazioni disponibili nelle pagine successive:

– login → inizializzo una variabile di sessione

– pagine successive → il contenuto di tale variabile è sempre disponibile

⇒ se voglio avere disponibile lo username in ogni pagina, basta metterlo in un variabile di sessione!

basta metterlo in un variabile di sessione!

Ho delle alternative per passare delle informazioni da una pagina all'altra?

• se passo da una form:

<INPUT TYPE="hidden" NAME="utente" value=$user/>

• se passo cliccando su un link:

A HREF " S i h ? t t $ "

Goy - a.a. 2009/2010 Programmazione Web 17

<A HREF="pagSuccessiva.php?utente=$user">

Riferimenti

Documenti correlati

Terminato l'esercizio, comparare la scrittura del testo friulano dell'Esercitazione con il testo friulano intero; se è tutto corretto e non mancano espressioni, passare alla

L’inadempimento anche di uno solo di tali obblighi può comportare la perdita totale o parziale del diritto all’Indennizzo ai sensi dell’art. Le spese sostenute per adempiere

franciacorta 2015 chardonnay metodo classico magnum trentasei 2014 lambrusco di sorbara metodo classico magnum sassaia 2018 garganega vino bianco macerato magnum. 100

Provvigione percepita dall’Intermediario: 49,50% dell’imponibile pari a €.. SI IMPEGNA al pagamento presso Unicredit S.p.a. del premio assicurativo a favore di CNP Assurances

In caso di Infortunio avvenuto o Malattia insorta dell'Assicurato, nel periodo di Durata dell’Assicurazione, che comportino per l’Assicurato un’Invalidità riduttiva in modo

Per il contenuto: (punto 2) deducendo dal valore delle cose assicurate il valore delle cose illese ed il valore delle cose danneggiate nonché gli oneri fiscali non dovuti all’Erario.

Le richieste di accesso ai dati registrati nella Centrale dei rischi della Banca d’Italia possono essere presentate presso una delle Filiali della Banca d’Italia

Qualora l'Assicurato in seguito a Malattia improvvisa o ad Infortunio avvenuti nel corso del Viaggio, dovesse sostenere Spese mediche/farmaceutiche/ospedaliere