Datei-Upload | Express.js |
Das Protokoll HTTP an sich ist zustandslos. In vielen Fällen ist es aber dringend notwendig, den Besuch einer Website über mehrere HTML-Seiten hinweg verfolgen zu können, beispielsweise, wenn der Kunde eines Online-Shops nicht bei jedem Seitenwechsel seinen Warenkorb verlieren möchte.
Cookies
Um dies zu erreichen, können Cookies eingesetzt werden. Cookies sind kleine Dateischnipsel, die eine Zuweisung erhalten (name=wert). Hier kann beispielsweise eine Sitzung mit einer ID versehen werden.
session=123456789Hinzu kommt die Information, welche URL sie erzeugt hat. Nur wenn ein Unterpfad dieser URL aufgerufen wird, wird der Cookie an den Server gesendet.
Der Cookie kann mit einem Verfallsdatum versehen werden. Jenseits dieses Zeitpunkts wird der Browser den Cookie löschen.
Ablauf
Der Server prüft bei einer GET-Anfrage, ob ein Cookie mitgesendet wurde. Falls das nicht der Fall ist, wird der Server eines erstellen und mit den angeforderten Daten zurücksenden.
Beispiel das Senden des Servers von einem Cookie
const http = require("http"); const host = 'localhost'; const port = 8080; const server = http.createServer(function (request, response) { response.statusCode = 200; response.setHeader('Content-Type', 'text/html'); response.setHeader('Set-Cookie', 'session_id=99999;'); const message="Da kam gerade ein Cookie"; response.end(message); }); server.listen(port, host, function() { console.log("Server is running on http://"+host+":"+port); });
Aufruf durch einen Client
Wird diese Seite aufgerufen, erhält der Aufrufer einen Cookie. Hier sichtbar gemacht mit dem Aufruf des Befehls curl.
curl -v localhost:8080 * Rebuilt URL to: localhost:8080/ * Trying 127.0.0.1... * TCP_NODELAY set * Connected to localhost (127.0.0.1) port 8080 (#0) > GET / HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/7.58.0 > Accept: */* > < HTTP/1.1 200 OK < Content-Type: text/html < Set-Cookie: session_id=99999; < Date: Fri, 03 Dec 2021 20:29:33 GMT < Connection: keep-alive < Content-Length: 24 < * Connection #0 to host localhost left intact Da kam gerade ein Cookie
Cookies des Browsers auslesen
Ein Browser hätte den Cookie nun in seinem Cache gespeichert. Bei einem erneuten Aufruf der URL würde er in dem Header "Cookie" diesen Cookie an den Server senden.Die Cookies werden in den Headern des Requests gespeichert. Sie werden in einer Zeichenkette übermittelt. Die Einträge werden durch ein Semikolon, gefolgt von einem Leerzeichen getrennt. Jeder Eintrag besteht aus einem Variablennamen, gefolgt von einem Gleichheitszeichen, gefolgt vom Wert.
const http = require("http"); const host = 'localhost'; const port = 8080; // Siehe Link unten function getCookieValue(cookie, name) { const b = cookie.match('(^|;)\\s*' + name + '\\s*=\\s*([^;]+)'); return b ? b.pop() : ''; } const server = http.createServer(function (request, response) { session = getCookieValue(request.headers.cookie, "session_id"); console.log("Session-ID: " + session); response.statusCode = 200; response.setHeader('Content-Type', 'text/html'); response.setHeader('Set-Cookie', 'session_id=99999;'); const message="Da kam gerade ein Cookie"; response.end(message); }); server.listen(port, host, function() { console.log("Server is running on http://"+host+":"+port); });
Die Session wird im Beispiel durch den Cookie session_id gespeichert. Das Auslesen des Wertes übernimmt die Funktion getCookieValue. Als Parameter erhält sie den Cookie-String und den gesuchten Namen. Den Wert ermittelt sie über einen regulären Ausdruck.
Der reguläre Ausdruck besagt, dass nach dem übergebenen String in dem Ausdruck gesucht wird. Dem vorangehen muss der Anfang des Strings oder ein Semikolon. Hinter dem Gleichheitszeichen wird durch die runden Klammern alles bis zum nachfolgenden Semikolon ausgeschnitten und zurückgegeben.
URL-Einträge und Hidden Input
Wenn Cookies nicht zur Debatte stehen, kann die Session auch über die URL trasportiert werden, indem man die Session-Id hinten an die URL der nächsten Seite anhängt.Eine einfache Möglichkeit, die Informationen in die URL zu zaubern, ist die Verwendung eines unsichtbaren Input-Felds im Formular.
<input type="hidden" id="session" name="session" value="123456789" />
Der Name und der Wert dieses Inputs wird bei Auswertung des Forms übertragen. Um den Inhalt (value) vor dem Übertragen zu ändern, kann das Input über seine id beispielsweise per JavaScript verändert werden.