Sessionmanagment

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());
  }
}
itmapa.de - X2H V 0.17

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:

  • encodeRedirectURL(java.lang.String url)
  • encodeURL(java.lang.String url)

  • erfolgen.

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;
   }
}
itmapa.de - X2H V 0.17

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.