セッションのトラッキング

HTTP プロトコルはステートレスであるため、Web アプリケーションは何らかの方法で、要求間でセッション情報を保持する必要があります。したがって、サーブレットが正しく機能するには、どのユーザが要求を送信しているか、そのユーザが Web アプリケーションとの対話を開始しているか、そのユーザが何を実行していたかをサーブレットが把握している必要があります。

単純な実装ではユーザ名が、セキュリティ保護されている実装ではユーザ名とパスワードが、電子商取引システムではショッピング カートがアプリケーションに記憶されます。サーブレット API を使用しないアプリケーションの場合、通常はアプリケーション固有の保存メカニズムを使用してセッション情報を保存し、非表示のフォーム フィールドまたはクッキーを通じてキー値をブラウザに返します。後続の要求では、このキー値を使用して前に保存されているセッション情報を取得します。

Java サーブレット仕様では HttpSession インターフェイスが定義されています。このインターフェイスによって、実装の詳細を把握せずにセッション管理を行うことができます。HttpSession インターフェイスは HttpServletRequest クラスから取得できます。

getSession メソッドによってセッションを確立し、getAttribute メソッドによってセッションからの値にアクセスします。

セッションの確立

  1. セッションで保存する値を確立します。
    public class SelectionForm extends HttpServlet {
    
    public void service(HttpServletRequest req, 
      HttpServletResponse resp) 
      throws IOException, ServletException {
      resp.setContentType(“text/html”);
      PrintWriter out = resp.getWriter();
      String thisName = "Unknown Name";
      // ログイン情報からユーザ名を取得します。
      String[] attrArray = req.getParameterValues("myName");
      // 呼び出しフォームには、myName の値が 1 つしかないと想定します。
      if(attrArray != null && attrArray.length > 0) {
        thisName = attrArray[0];
      }
    }
    ...
    
  2. HttpServletRequest オブジェクトの getSession メソッドを呼び出すことによって新しいセッションを作成します。
    // セッションを作成します。
    HttpSession thisSession = req.getSession();
    
  3. セッションに属性を割り当てます。
    // この例では、ユーザ名を保存します。
    thisSession.setAttribute("name", thisName);
    

セッション情報へのアクセス

  1. HttpServletRequest オブジェクトの getSession メソッドを呼び出すことによって session オブジェクトの参照を取得します。
    import java.io.*; 
    import javax.servlet.*;
    import javax.servlet.http.*;
    
    public class DisplayInfo extends HttpServlet {
    
    public void service(HttpServletRequest req, 
      HttpServletResponse resp)
      throws IOException, ServletException {
      resp.setContentType(“text/html”);
      PrintWriter out = resp.getWriter();
      out.println("<html><head><title>Display Information");
      out.println("</title></head><body>");
      out.println("<h1>displayInfo Servlet</h1>");
      // session オブジェクトからログイン ユーザを取得します。
      HttpSession thisSession = req.getSession();
    ...
    
  2. HttpSession オブジェクトの getAttribute メソッドを使用して希望する属性値にアクセスします。必ず結果を適切なタイプに変換してください。
    String userName = (String)thisSession.getAttribute("name");
    
  3. コード内での属性値を使用します。
    if(userName != null) {
      out.println("<h2>Welcome " + userName + "</h2>");
    }