Session

Der Datenaustausch im Web erfolgt über das zustandslose Protokolle HTTP. Da das Protokoll vom Design keinen Zustand abbildet, kann der Protokollstack auf komplizierte Strukturen verzichten. Dies ist sicherlich ein Baustein für den großen Erfolg von HTTP. Leider hat dieser Verzicht auf einen Status für Softwareentwickler gravierende Nachteile. Der Entwickler einer Webanwendung weiß bei einer Anfrage nicht von welchem Benutzer die Anfrage kommt und welche Anfragen vorausgegangen sind. Der Entwickler muß sich also um die Implementierung selber kümmern.

Die Summe aller Anfragen, die ein Besucher an eine Webanwendung richtet wird als eindeutige Sitzung (englisch Session) bezeichnet. In PHP gibt es bereits eine fertige Implementierung der Session, die den Entwickler alle Aufgaben abnimmt. Um die Session in Alvine integrieren zu können und alle Vorteile die Alvine bietet, dem Entwickler zugänglich zu machen, gibt es die Session-Klasse.

Die Session-Klasse kapselt die notwendigen Informationen und Methoden. Um eine Session zu erstellen muss nur ein neues Session-Objekt erstellt werden. Zum speichern der Session kann das Session-Objekt an eine Storage-Instanz übergeben werden.

Session erstellen und speichern

In dem folgenden Beispiel wird das Session-Objekt in das Verzeichnis tmpsession gespeichert.

// Session erstellen
$session = new \Alvine\Net\Session\Session();

// Storage-Objekt
$source = new \Alvine\Persistence\Provider\File\DataSource('/tmp/session');
$object = new \Alvine\Persistence\Provider\File\DataObject($source);
$storage = new \Alvine\Persistence\ObjectStorage($object);

// Die Session speichern
$storage->writeObject($session);

Session laden

Eine gespeicherte Session kann bei einem weiteren Request über die Session-ID wieder geladen werden. In diesem Beispiel wird die Session-ID über einen Request übergeben.

// Storage-Objekt
$source = new \Alvine\Persistence\Provider\File\DataSource('/tmp/session');
$object = new \Alvine\Persistence\Provider\File\DataObject($source);
$storage = new \Alvine\Persistence\ObjectStorage($object);

// Session laden
$session = $storage->getObjectByID($sid);

Wert in der Session speichern

Werte können in einer Session einfach durch die Angabe einer Eigenschaft gespeichert werden.

// Session erstellen
$session = new \Alvine\Net\Session\Session();

// Der Session eine Session-Variable zuordnen
$session->meineSchluessel = 'Mein Wert';

// Wert aus einer Session auslesen
echo $session->meineSchluessel;
// Ergibt -> Mein Wert

Nonces verwalten

Ein Nonce (oder Zufallstoken) ist ein Sicherheitsfeature und wird für einen Request erstellt und kann mit einem Formular zurückgesendet werden. Jeder Nonce kann nur einmal verwendet werden. Wird ein Request mit einem ungültigen Nonce gesendet kann die Anwendung die Verarbeitung eines Formulars oder des Requests ablehnen.

// Session erstellen
$session = new \Alvine\Net\Session\Session();
$nonce = new Alvine\Net\Session\Nonce();
$token = $nonce->getToken();
$session->addNonce($nonce);

// Session speichern und Token in Formular einbauen
// ... hier session speichern ...
echo '<input type="hidden" value="'.$token.'">';
// Ergibt -> <input type="hidden" value="e1cbc9b62a8046c597f9219488e65036">

Beim nächsten Request kann über die Methode Session::redeemedNonce() der Token überprüft werden.

$session = new \Alvine\Net\Session\Session();
if($session->redeemedNonce($nonce)) {
    echo 'OK';
} else {
    echo 'Der Request war fehlerhaft.';
}