セッションオブジェクトの削除

広告

セッションに格納されたセッションオブジェクトの削除について確認します。

セッションオブジェクトを削除する場合には「HttpSession」インターフェースで定義されている"removeAttribute"メソッドを使います。

Removes the object bound with the specified name from this session. 
If the session does not have an object bound with the specified 
name, this method does nothing. 

After this method executes, and if the object implements 
HttpSessionBindingListener, the container calls 
HttpSessionBindingListener.valueUnbound. The container then notifies
any HttpSessionAttributeListeners in the web application. 

Parameters:
  name - the name of the object to remove from this session 
Throws: 
  java.lang.IllegalStateException - if this method is called on an 
    invalidated session

"removeAttribute"メソッドは、引数に指定した「名前」のセッションオブジェクト削除します。

例えばセッションオブジェクトとして名前が「visited」のものを削除する場合には下記のように記述します。

public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws IOException, ServletException{

  response.setContentType("text/html; charset=Shift_JIS");
  PrintWriter out = response.getWriter();

  HttpSession session = request.getSession(true);

  session.removeAttribute("visited");
}

サンプルプログラム

では簡単に試してみます。テストするにあたってセッションに登録されている全てのセッションオブジェクトを取得する"getAttributeNames"メソッドを使います。

Returns an Enumeration of String objects containing the names of all 
the objects bound to this session. 

Returns:
  an Enumeration of String objects specifying the names of all the 
    objects bound to this session 
Throws: 
  java.lang.IllegalStateException - if this method is called on an 
    invalidated session

web.xmlファイルは下記のようにしました。

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  version="2.4">

  <servlet>
    <servlet-name>sessiontest</servlet-name>
    <servlet-class>SessionTest2</servlet-class>
  </servlet>

  <servlet>
    <servlet-name>deleteobject</servlet-name>
    <servlet-class>DeleteObject2</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>sessiontest</servlet-name>
    <url-pattern>/sessiontest</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>deleteobject</servlet-name>
    <url-pattern>/deleteobject</url-pattern>
  </servlet-mapping>
</web-app>

プログラムは下記の通りです。

SessionTest2.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Enumeration;

public class SessionTest2 extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

    response.setContentType("text/html; charset=Shift_JIS");
    PrintWriter out = response.getWriter();

    HttpSession session = request.getSession(false);

    out.println("<html>");
    out.println("<head>");
    out.println("<title>セッションテスト</title>");
    out.println("</head>");
    out.println("<body>");

    if (session == null){
      out.println("<p>セッションオブジェクトを登録します</p>");
      session = request.getSession(true);

      session.setAttribute("age", "24");
      session.setAttribute("name", "山田");
    }

    /* 現在登録されているセッションオブジェクトを表示 */
    out.println("<p>");
    out.println("登録されているセッションオブジェクトを表示します<br>");
    Enumeration enum_session = session.getAttributeNames(); 
    while(enum_session.hasMoreElements()) {
      String key = (String)enum_session.nextElement();
      String val = (String)session.getAttribute(key);

      out.println(key + " = " + val + "<br>");
    }
    out.println("</p>");

    out.println("<a href=¥"/session/deleteobject¥">ageオブジェクトの削除</a>");

    out.println("</body>");
    out.println("</html>");
  }
}

DeleteObject2.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Enumeration;

public class DeleteObject2 extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

    response.setContentType("text/html; charset=Shift_JIS");
    PrintWriter out = response.getWriter();

    HttpSession session = request.getSession(false);

    out.println("<html>");
    out.println("<head>");
    out.println("<title>セッションテスト</title>");
    out.println("</head>");
    out.println("<body>");

    if (session != null){
      session.removeAttribute("age");

      /* 現在登録されているセッションオブジェクトを表示 */
      out.println("<p>");
      out.println("登録されているセッションオブジェクトを表示します<br>");

      Enumeration enum_session = session.getAttributeNames(); 
      while(enum_session.hasMoreElements()) {
        String key = (String)enum_session.nextElement();
        String val = (String)session.getAttribute(key);

        out.println(key + " = " + val + "<br>");
      }

      out.println("</p>");
    }else{
      out.println("<p>セッションがありません</p>");
    }

    out.println("</body>");
    out.println("</html>");
  }
}

上記をコンパイル後に「d:¥servlet-sample¥session¥WEB-INF¥classes¥」ディレクトリにクラスファイルを移動した後で、ブラウザで「http://localhost:8080/session/sessiontest」へアクセスしてみます。

セッションオブジェクトの削除

最初に表示した時に、「age」と「name」というセッションオブジェクトを登録し、画面に表示しています。

ここで「age」と言う名前のセッションオブジェクトを削除します。「ageオブジェクトの削除」をクリックして下さい。

セッションオブジェクトの削除

「age」と言う名前のセッションオブジェクトが削除されていることを確認できます。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)