Das HTTP-Protokol ist ein zustandsloses Protokol. Bei jeder Anfrage an den
Server ist zunächst unbekannt, ob der Client bereits in Verbindung mit
dem Server stand. Um nun Informationen über die Client-Server
Kommunikation permanent zu halten bieten sich 2 Möglichkeiten an:
1. Cookies
2. URL-Rewriting
Ein kleines Beispiel zur Kommunikation mit Cookies zeigt Servlet6.java
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Servlet6 extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ doPost(request,response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ Cookie[] myCookies = request.getCookies(); Cookie theCookie = null; if (myCookies != null){ for (int i = 0; i < myCookies.length; ++i){ if (myCookies[i].getName().equals("Servlet6Test")) theCookie = myCookies[i]; } } if (theCookie == null) theCookie = new Cookie("Servlet6Test","0"); theCookie.setValue(String.valueOf(Integer.parseInt(theCookie.getValue())+1)); response.addCookie(theCookie); response.setContentType("text/plain"); PrintWriter writer = response.getWriter(); writer.println("Your visit counter: "+theCookie.getValue()); } }
Dieses Beispiel erfragt zunächst einmal alle Cookies, die mit der aktuellen Web-Resource in Verbindung stehen. Im Anschluss wird ein spezielles, dem service entsprechendes Cookie gesucht. Ist dieses nicht vorhanden, wird ein neues Cookie für den aktuellen Service erstellt. Nach der Modifikation des Cookies wird es dem Response hinzugefügt. Es ist zu beachten, dass Cookies vor dem verschicken des Writers abgesendet werden müssen.
Für den Fall das der Anwender Cookies verweigert, kann URL-Rewriting für das Sesseionmanagment eingesetzt werden. Hierbei wird an jeder URL eine Sitzungskennung angehängt. Diese Sitzungskennung muss an jeder URL angehängt werden. Wird dies z.B bei einem Link vergessen, wird die Verbindung zur aktuellen Sitzung gelöst, sofern dieser Link angewählt wird.
Das anhängen der Sitzungskennung kann vom HTTPServletResponse
automatisch über die Methoden:
In der Praxis übernimmt ein HttpSession Objekt das Sessionmanagment.
Wenn möglich wird das Sessionmanagment über Cookies erfolgen. Wo
dies nicht möglich ist, wird URL-Rewriting eingesetzt. Obwohl bei der
Verwendung von Cookies ein encodeURL oder encodeRedirectURL
überflüssig sind ist es Ratsam diese zu verwenden, da man dann eine
Code Basis für beide Verfahren des Sessionmanagments hat.
Das nachfolgende Beispiel zeigt die Verwendung eines HttpSession Objektes
für das Sessionmanagment. Es ist dabei unwichtig, ob Cookies erlaubt
sind odernicht.
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Servlet7 extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ doPost(request,response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ HttpSession session = request.getSession(); SessionObject so = (SessionObject)session.getAttribute("Servlet7Test"); if (so == null) so = new SessionObject(); response.setContentType("text/html"); PrintWriter writer = response.getWriter(); writer.println("<html><body>"); writer.println("Your counter: "+String.valueOf(so.getClickNumber())); String url = response.encodeURL("http://localhost:8080/Servlet7"); writer.println("<a href=\""+url+"\">Servlet7</a>"); writer.println("</body></html>"); session.setAttribute("Servlet7Test",so); } } class SessionObject{ private int clickNumber = 0; protected int getClickNumber(){ ++clickNumber; return clickNumber-1; } }
Eine weitere Möglichkeit des Sessionmanagments ist die Verwendung von versteckten Feldern, die Informationen über die aktuelle Session enthalten und diese Daten als Formulardaten an den Server übertragen.