Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
3
Übersicht
• Servlet Initialisierung• Attribute und Gültigkeitsbereiche• Sessions• Lebenszyklusereignisse
5
Initialisierung
• Konfiguration des Servlets und der Web Applikation
• Es können Änderungen vorgenommen werden, ohne den Code zu kennen
• Initialisierungsparameter im DeploymentDescriptor
6
Servlet Initialisierung
Container(Application Server)
Servlet A
Servlet B
Servlet C
ServletConfig A
ServletConfig B
ServletConfig CSer
vlet
Con
text
Web Application
7
ServletConfig vs. ServletContext
„Globale Variable“„Lokale Variable“
Im <web-app> Tag des Deployment Descriptors
definiert
Im <servlet> Tag des Deployment Descriptors
definiert
Gilt für alle Servlets in der Webapplikation
Gilt nur für ein spezifisches Servlet
ServletContextServletConfig
8
Der Deployment Descriptor im Projekt
9
Grobaufbau DeploymentDescriptor
10
Angabe der Servlet-SpezifischenParameter im Deployment
Descriptor
Mehrere init-params sind einfach mehrereBlöcke dieser Art hintereinander!
11
Verwendung der Parameter im Servlet
Hinweis: Schlechter Programmierstil. (Warum?) Aber auch hier gilt die Regel – tut was ich sage und nicht, was ich mache!Klasse: init.BasicInit
12
Angabe/Verwendung der webapplikationsspezifischen Parameter
Klasse: init.ContextUser
13
Gruppendiskussion
Wie könnte es zu dieser Ausgabe
kommen?
15
Motivation
Informations-austauschzwischen
verschiedenen Elementen
16
Attribute Konzept
• Servlets können miteinander kommunizieren, indem sie Objekte als Attribute definieren
• Diese können einen beliebigen Typ haben (d.h. Rückgabewert ist Object!)
• Attribute werden in verschiedenen Bereichen abgelegt, je nach Gültigkeit
17
Attributsbereiche
?Bis die Session beendet ist
Für einen Anwender, bis er
die Web-App„verlässt“
Session
?
Bis die Requestnicht mehr
weitergegeben wird
Alle Elemente in der Kette dieser
RequestRequest
?Wie die Anwendung
Ganze WebanwendungContext
VerwendungLebensdauerGültigkeitsbereich
18
Attributsbereiche
EinkaufswagenBis die Session beendet ist
Für einen Anwender, bis er
die Web-App„verlässt“
Session
Zwischen-ergebnisse
Bis die Requestnicht mehr
weitergegeben wird
Alle Elemente in der Kette dieser
RequestRequest
Datenbank-verbindung
Wie die Anwendung
Ganze WebanwendungContext
VerwendungLebensdauerGültigkeitsbereich
19
Attribut-API: Context
• Im Interface ServletContext• Im Servlet über getServletContext()
verfügbar• Methoden:
– getAttribute(String)– setAttribute(String,Object)– removeAttribute(String)– getAttributeNames()
20
Attribut-API: Request
• Im Interface ServletRequest (und damit auch in HttpServletRequest)
• Methoden:– getAttribute(String)– setAttribute(String,Object)– removeAttribute(String)– getAttributeNames()
21
Attribut-API: Session
• Im Interface HttpSession (mehr dazu später)
• Methoden:– getAttribute(String)– setAttribute(String,Object)– removeAttribute(String)– getAttributeNames()
22
Wichtige Anmerkungen zu Attributen
• Rückgabetyp ist Object, also ist ein Castnotwendig
• Nicht thread-sicher, d.h. man sollte sich genau überlegen, wo man Attribute setzt oder ausliest um Überlappungen zu vermeiden, bzw. einen synchronized()-Block auf die HttpSession oder den Context anzuwenden
23
Verwendung von Attributen –Setzen (z.B. im Context)
ServletContext!
Klasse: init.SampleContextListener
24
Verwendung von Attributen -Auslesen
Klasse: init.ContextUser2
26
Problem: Das http-Protokoll ist zustandslos
Request
Response
Verbindungsaufbau
Verbindung beendet
Im http-Protokoll wird nach jeder Anfrage die Verbindung beendet.Zustandslosigkeit
27
Gruppendiskussion: Was wird hier passieren?
Kaufe Buch X
Zeige EinkaufwagenUser: Cowboy Bill
Kaufe Buch Y
Kaufe Buch X
Zeige Einkaufwagen
Kaufe Buch YUser: Gentleman Dave
User: Cowboy Bill
User: Cowboy Bill
28
Antwort
• Im reinen Http ohne zusätzliche Sessionverwaltung sind die Anfragen anonym
• Der Server vergisst sofort wieder, ob Dave oder Bill eingekauft haben
• Somit kann er den Warenkorb nicht zuordnen!
29
Lösung: Cookies
• Cookies speichern Informationen auf der Client Seite
• Diese Information wird mit jeder Anfrage an den Server übertragen
• Über einen Cookiewert („Session ID“) kann der Server erkennen, wer die Anfrage gestellt hat
30
Session IDs
CB Kauft Buch X
Zeige Ek-Wagen CB
GD Kauft Buch YUser: Gentleman Dave
User: Cowboy Bill
User: Cowboy Bill
Anmelden als CBUser: Cowboy BillCB
CB
Anmelden als GDUser: Gentleman Dave
GD
GD
CB
31
Vorgehen im Servlet-Umfeld
Session erzeugen
Session abfragen
Informationenin Session speichern
32
Session erzeugen/abfragen
• Wird mit dem gleichen „Befehl“ erreicht• Wenn keine Session existiert, dann wird
eine neue erzeugt
• request.getSession()• HttpSession Objekt
33
Beispiel für Sessionverwaltung
Neue Initial-Informationen anlegen
(z.B. leeren Warenkorb)
Werte anpassen (z.B. basierend auf den
übergebenen Parameters)
Klasse: session.BeanCounterServlet (Aufruf über: BeanCounter.html)
34
Sessionlebenszyklus
• Erzeugung: getSession() – s. vorherige Seiten
• Beenden der Session:– Timeout– Explizites Beenden (invalidate())– Application endet (z.B. durch einen Absturz
oder weil sie undeployed wird)
35
Steuerung des Timeout (1)
Timeout-Zeitspannefür alle Servlets in
der Web-Applikation in Minuten
36
Steuerung des Timeout (2)
Timeout-Zeitspannefür diese Session in
Sekunden
Klasse: session.BeanCounterServlet (Aufruf über: BeanCounter.html)
37
Explizites Beenden einer Session
Die Session endet sofort, Zugriffe auf das Session Objekt nicht mehr legitim(IllegalStateException)
Klasse: session.SessionInvalidator
38
Exotische Fälle kurz erklärt
• Was passiert, wenn der Client keine Cookies annimmt?
• Was passiert bei Load Balancing mit den Sessions?
• Kann ich auch eigene Cookies explizit setzen?
39
Client nimmt keine Cookies an
• Jedesmal, wenn getSession() aufgerufen wird, denkt der Container, dass eine neue Session angelegt werden muss.
• Workaround: URL-Rewriting• URL-Rewriting: Die Session-Id kommt
nicht in einen Cookie, sondern wird als String an die URL angehängt
40
Verwendung des URL-Rewriting
Diese Aktion muss für alle URLs in der Web-Applikation durchgeführt werden
(s. auch encodeRedirectURL())
Klasse: session.UrlEncoder
41
Url-Rewriting Hinweise
• Wenn man diese Technik verwendet, dann wird nur dann trifft der Container eine Entscheidung:– Werden keine Cookies akzeptiert, dann wird
durch jede „markierte URL“ verändert– Werden Cookies akzeptiert, dann wird die
„Markierung“ ignoriert
42
Was bedeutet URL Rewriting für mich?
• Wenn ich sicherstellen will, dass Sessions auch dann funktionieren, wenn keine Cookies erlaubt sind, brauche ich URL Rewriting
• D.h. jede(!) Servlet/JSP-URL muss mit dem „Rewriting-Befehl“ modifiziert werden
43
Exotische Fälle kurz erklärt
• Was passiert, wenn der Client keine Cookies annimmt?
• Was passiert bei Load Balancing mit den Sessions?
• Kann ich auch eigene Cookies explizit setzen?
44
Load Balancing
Container I(Application Server)
A
Request
Container II(Application Server)
A
Verteilt die Anfragen gleichmäßig auf Server I und II.
Session Info
45
Load Balancing
Container I(Application Server)
A
Request
Container II(Application Server)
A
Kann bei Bedarf Session Infos verschieben!
46
Verschieben von Session Infos
• Alle Attribute müssen Serializable sein!• Für den Programmierer und für den
Client bleibt der Umzug unsichtbar
47
Exotische Fälle kurz erklärt
• Was passiert, wenn der Client keine Cookies annimmt?
• Was passiert bei Load Balancing mit den Sessions?
• Kann ich auch eigene Cookies explizit setzen?
48
Cookies explizit setzen
• Ja, über javax.servlet.http.Cookie• Hat für reine JEE-Anwendungen nur
wenig Sinn• Gruppendiskussion: Was ist die bessere
Alternative für uns?
50
Listener Konzept
Container(Application Server)
Servlet A
Servlet B
Servlet CSer
vlet
Con
text
Web Application
ServletContextListener
Initialisierung
Zerstörung
Wird über die Ereignisse informiert und kann passenden Code
ausführen
51
Implementierung des ServletContextListeners
Beim Starten der Anwendung wird ein Attribute gesetzt und ist nun für
alle Servlets verfügbar!
52
Einbindung in die Web-App
Die Art des Listeners wird automatisch erkannt.Wichtig: Nicht in ein Servlet-Tag packen!
53
Einige weitere Listener
• ServletContextAttributeListener:Hinzufügen, Ersetzen und Entfernen von Attributen
• HttpSessionListener: Session beginnt/endet (Wieviele aktive User gibt es?)
• HttpSessionBindingListener: Wird ein Objekt gerade als Attribut verwendet?
• ….
55
Lernziele
• Context und Config verwenden können.• Attribute verwenden können und die
verschiedenen Geltungsbereiche kennen.
• Sessions einsetzen können• Bedeutung von URL-Rewriting verstehen• Load Balancing Konzept erklären können• Listener verstehen
57
Szenario• Schreibe eine Anwendung, die jedem Anwender die
Namen aller anderen Anwender zeigt, die aktiv sind.• Anwender melden sich an/ab über ein Webformular• Die Email des Webmasters wird über den Deployment
Descriptor definiert.
• Fortgeschrittene: – In der Anwendung können Nachrichten für andere Anwender
hinterlassen werden.– Das Message Board ist ein eigenes Servlet