diff --git a/web/08/demos/01_routing_servemux.go b/web/08/demos/01_routing_servemux.go
new file mode 100644
index 0000000..cf9c41e
--- /dev/null
+++ b/web/08/demos/01_routing_servemux.go
@@ -0,0 +1,26 @@
+package main
+
+import (
+ "fmt"
+ "net/http"
+)
+
+type appleHandler int
+type bananaHandler string
+
+func (a appleHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ fmt.Fprintln(w, "Apple 🍎")
+}
+
+func (b bananaHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ fmt.Fprintln(w, "Banana 🍌")
+}
+
+func main() {
+ var a appleHandler
+ var b bananaHandler
+ mux := http.NewServeMux()
+ mux.Handle("/apple", a)
+ mux.Handle("/banana", b)
+ http.ListenAndServe("localhost:8080", mux)
+}
diff --git a/web/08/demos/02_routing_defaultservemux.go b/web/08/demos/02_routing_defaultservemux.go
new file mode 100644
index 0000000..08cc906
--- /dev/null
+++ b/web/08/demos/02_routing_defaultservemux.go
@@ -0,0 +1,25 @@
+package main
+
+import (
+ "fmt"
+ "net/http"
+)
+
+type appleDefaultHandler int
+type bananaDefaultHandler string
+
+func (a appleDefaultHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ fmt.Fprintln(w, "Apple")
+}
+
+func (b bananaDefaultHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ fmt.Fprintln(w, "Banana")
+}
+
+func main() {
+ var a appleDefaultHandler
+ var b bananaDefaultHandler
+ http.Handle("/apple", a)
+ http.Handle("/banana", b)
+ http.ListenAndServe("localhost:8080", nil)
+}
diff --git a/web/08/demos/03_routing_handlefunc.go b/web/08/demos/03_routing_handlefunc.go
new file mode 100644
index 0000000..4774176
--- /dev/null
+++ b/web/08/demos/03_routing_handlefunc.go
@@ -0,0 +1,20 @@
+package main
+
+import (
+ "fmt"
+ "net/http"
+)
+
+func appleFunc(w http.ResponseWriter, r *http.Request) {
+ fmt.Fprintln(w, "🍎 Apple func antwortet")
+}
+
+func bananaFunc(w http.ResponseWriter, r *http.Request) {
+ fmt.Fprintln(w, "🍌 Banana func antwortet")
+}
+
+func main() {
+ http.HandleFunc("/apple", appleFunc)
+ http.HandleFunc("/banana", bananaFunc)
+ http.ListenAndServe("localhost:8080", nil)
+}
diff --git a/web/08/demos/04_marshal_unmarshal_json.go b/web/08/demos/04_marshal_unmarshal_json.go
new file mode 100644
index 0000000..dcc2859
--- /dev/null
+++ b/web/08/demos/04_marshal_unmarshal_json.go
@@ -0,0 +1,35 @@
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/http"
+)
+
+type User struct {
+ Firstname string `json:"firstname"`
+ Lastname string `json:"lastname"`
+ Age int `json:"age"`
+}
+
+func encode(w http.ResponseWriter, r *http.Request) {
+ mariam := User{
+ Firstname: "Mariam",
+ Lastname: "Okonkwo",
+ Age: 25,
+ }
+
+ json.NewEncoder(w).Encode(mariam)
+}
+
+func decode(w http.ResponseWriter, r *http.Request) {
+ var user User
+ json.NewDecoder(r.Body).Decode(&user)
+ fmt.Fprintf(w, "%s %s is %d years old!", user.Firstname, user.Lastname, user.Age)
+}
+
+func main() {
+ http.HandleFunc("/encode", encode)
+ http.HandleFunc("/decode", decode)
+ http.ListenAndServe("localhost:8080", nil)
+}
diff --git a/web/08/demos/05_cookies.go b/web/08/demos/05_cookies.go
new file mode 100644
index 0000000..3ddb9dc
--- /dev/null
+++ b/web/08/demos/05_cookies.go
@@ -0,0 +1,48 @@
+package main
+
+import (
+ "fmt"
+ "net/http"
+)
+
+func start(w http.ResponseWriter, r *http.Request) {
+ fmt.Fprintln(w, "Setze Cookie")
+ fmt.Fprintln(w, "Zeige Cookie")
+ fmt.Fprintln(w, "Lösche Cookie")
+}
+
+func setCookie(w http.ResponseWriter, r *http.Request) {
+ c := &http.Cookie{Name: "lang", Value: "de"}
+ http.SetCookie(w, c)
+ fmt.Fprintln(w, "
Cookie gesetzt. Überprüfe in Dev-Tools oder hier anzeigen oder hier löschen
")
+}
+
+func getCookie(w http.ResponseWriter, r *http.Request) {
+ c, err := r.Cookie("lang")
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusBadRequest)
+ return
+ }
+ fmt.Fprintln(w, "Cookie: lang = ", c.Value)
+}
+
+func clearCookie(w http.ResponseWriter, r *http.Request) {
+ c, err := r.Cookie("lang")
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusBadRequest)
+ return
+ }
+ c.MaxAge = -1
+ http.SetCookie(w, c)
+ fmt.Fprintln(w, "Cookie gelöscht: lang")
+}
+
+func main() {
+ http.HandleFunc("/", start)
+ http.HandleFunc("/set", setCookie)
+ http.HandleFunc("/get", getCookie)
+ http.HandleFunc("/clear", clearCookie)
+
+ fmt.Println("Server läuft auf http://localhost:8080")
+ http.ListenAndServe(":8080", nil)
+}
diff --git a/web/08/demos/merkzettel/06_merkliste.html b/web/08/demos/merkzettel/06_merkliste.html
new file mode 100644
index 0000000..103ea45
--- /dev/null
+++ b/web/08/demos/merkzettel/06_merkliste.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+ Bücher-Merkliste
+
+
+
+ Eigenen Merkzettel anlegen
+
+
+ Gehe zu Merkzettel
+
+
+
\ No newline at end of file
diff --git a/web/08/demos/merkzettel/06_session.go b/web/08/demos/merkzettel/06_session.go
new file mode 100644
index 0000000..ef52b95
--- /dev/null
+++ b/web/08/demos/merkzettel/06_session.go
@@ -0,0 +1,64 @@
+package main
+
+import (
+ "fmt"
+ "net/http"
+ "sync"
+
+ "github.com/google/uuid"
+)
+
+// Session-Speicher (Map von SessionID -> Merkzettel)
+var (
+ sessions = make(map[string][]string)
+ mu sync.Mutex
+)
+
+// Hilfsfunktion: Session-ID aus Cookie holen oder neue erstellen
+func getSessionID(w http.ResponseWriter, r *http.Request) string {
+ cookie, err := r.Cookie("session_id")
+ if err != nil {
+ // Neue Session-ID erzeugen (UUID)
+ newID := uuid.New().String()
+ http.SetCookie(w, &http.Cookie{
+ Name: "session_id",
+ Value: newID,
+ })
+ mu.Lock()
+ sessions[newID] = []string{} // leeren Merkzettel anlegen
+ mu.Unlock()
+ return newID
+ }
+ return cookie.Value
+}
+
+// Buch zum Merkzettel hinzufügen
+func addToMerkzettel(w http.ResponseWriter, r *http.Request) {
+ sessionID := getSessionID(w, r)
+ book := r.URL.Query().Get("book")
+ if book == "" {
+ fmt.Fprintln(w, "Bitte Buchtitel angeben: ?book=XYZ")
+ return
+ }
+ mu.Lock()
+ sessions[sessionID] = append(sessions[sessionID], book)
+ mu.Unlock()
+ fmt.Fprintf(w, "Buch '%s' zum Merkzettel hinzugefügt!\n", book)
+}
+
+// Merkzettel anzeigen
+func showMerkzettel(w http.ResponseWriter, r *http.Request) {
+ sessionID := getSessionID(w, r)
+ mu.Lock()
+ books := sessions[sessionID]
+ mu.Unlock()
+ fmt.Fprintf(w, "Dein Merkzettel: %v\n", books)
+}
+
+func main() {
+ http.HandleFunc("/add", addToMerkzettel)
+ http.HandleFunc("/list", showMerkzettel)
+
+ fmt.Println("Server läuft auf http://localhost:8080")
+ http.ListenAndServe(":8080", nil)
+}
diff --git a/web/08/demos/merkzettel/go.mod b/web/08/demos/merkzettel/go.mod
new file mode 100644
index 0000000..a13d467
--- /dev/null
+++ b/web/08/demos/merkzettel/go.mod
@@ -0,0 +1,5 @@
+module demo/session
+
+go 1.24.5
+
+require github.com/google/uuid v1.6.0
diff --git a/web/08/demos/merkzettel/go.sum b/web/08/demos/merkzettel/go.sum
new file mode 100644
index 0000000..7790d7c
--- /dev/null
+++ b/web/08/demos/merkzettel/go.sum
@@ -0,0 +1,2 @@
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
diff --git a/web/08/labor/08_aufgaben.md b/web/08/labor/08_aufgaben.md
new file mode 100644
index 0000000..0470ed2
--- /dev/null
+++ b/web/08/labor/08_aufgaben.md
@@ -0,0 +1,23 @@
+# Übungsblatt 08
+
+## 1. Go-Übung: Routing
+
+**Aufgabenstellung**: Erstellen Sie ein einfaches Webserver-Programm in Go, das zwei HTTP-Endpunkte `/login` und `/logout` bereitstellt. Beim Aufruf dieser Pfade soll jeweils eine passende Textnachricht im Browser erscheinen. Verwenden Sie dazu die Standardbibliothek `net/http` und definieren Sie eigene Funktionen zur Übergabe an `HandleFunc`.
+
+## 2. Go-Übung: JSON-Daten empfangen
+
+**Aufgabenstellung**: Erweitern Sie den Endpunkt aus Übungsblatt 07 Aufgabe 3 so, dass auch JSON-Daten empfangen und ausgegeben werden können.
+
+- Nutzen Sie dazu gerne die zuvor von Ihnen in Übungsblatt 06 definierte SWAGGER-Schnittstelle.
+- Falls die JSON-Daten fehlerhaft sind, soll der Status-Code 400 (Bad Request) zurückgegeben werden.
+- Testen Sie Ihren Endpunkt mit `curl`-Befehlen oder wahlweise mit Postman oder SWAGGER.
+
+## 3. Go-Übung: Cookies
+
+**Aufgabenstellung**: Erstellen Sie ein einfaches Webserver-Programm in Go, das drei HTTP-Endpunkte `/create-cookie`, `/show-cookie` und `/delete-cookie` bereitstellt. Beim Aufruf dieser Pfade soll entweder ein neuer Cookie mit dem Namen `keks` und einer generierten UUID als Wert erstellt, der Wert im Browser ausgegeben oder der Cookie ganz gelöscht werden. Außerdem soll jeweils eine passende Textnachricht im Browser erscheinen.
+
+#### Hinweis
+Um externe Bibliotheken (z.B. `github.com/google/uuid` zur Erstellung von UUIDs) verwenden zu können, müssen Sie zunächst ein Modul definieren und die Abhängigkeiten darüber verwalten. Eine kurze Anleitung dazu finden Sie hier: [Abhängigkeiten mit go.mod](anleitung_extlib.md)
+
+
+
diff --git a/web/08/labor/anleitung_extlib.md b/web/08/labor/anleitung_extlib.md
new file mode 100644
index 0000000..66eb03a
--- /dev/null
+++ b/web/08/labor/anleitung_extlib.md
@@ -0,0 +1,26 @@
+# Abhängigkeitsverwaltung mit `go.mod`
+
+## Hintergrund
+
+Externe Pakete, die im Code importiert werden, werden über eine `go.mod`‑Datei verwaltet. Diese Datei definiert das Modul und listet alle Abhängigkeiten auf. Sie gehört fest zum Projekt und wird im Quellcode‑Repository mitgeführt.
+
+## Anweisungen
+
+Annahme: Go-Programm ist bereits vorhanden und die Imports im Code sind gesetzt. Außerdem befinden Sie sich in dem Ordner mit dem Go-Programm.
+
+1. **Modul initialisieren (falls noch nicht geschehen)**
+```bash
+go mod init example.com/myapp
+```
+Der Modulpfad entspricht in der Praxis meist der Repository‑Adresse, z. B. `github.com/mymodule`. Für einfache Beispiele genügt ein Platzhalter wie `example.com/myapp`
+
+2. **Abhängigkeiten auflösen und aufräumen**
+```bash
+go mod tidy
+```
+Dadurch werden alle im Code verwendeten Imports heruntergeladen und ins `go.mod` eingetragen. Nicht mehr benötigte Pakete werden entfernt.
+
+3. **Programm starten**
+```bash
+go run .
+```
\ No newline at end of file