セッションの有効期限

広告

セッションの有効期限を設定してみます。まずデフォルトの有効期限を確認してみましょう。

セッションの有効期限を取得するには「HttpSession」インターフェースで定義されている"getMaxInactiveInterval"メソッドを使います。

Returns the maximum time interval, in seconds, that the servlet 
container will keep this session open between client accesses. 
After this interval, the servlet container will invalidate the 
session. The maximum time interval can be set with the 
setMaxInactiveInterval method. A negative time indicates the session
 should never timeout. 

Returns:
  an integer specifying the number of seconds this session remains
    open between client requests

取得した値はint型の値となっており単位は秒数です。

サンプルプログラム

では試してみます。

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>SessionTest5</servlet-class>
  </servlet>

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

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

SessionTest5.java

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

public class SessionTest5 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);
    }

    int intervalTime = session.getMaxInactiveInterval();

    out.println("<p>");
    out.println("デフォルトの有効期限は" + intervalTime + "秒です<br>");
    out.println("</p>");

    out.println("<a href=\"/session/sessiontest\">再表示</a>");

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

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

セッションの有効期限

以上のようにデフォルトのセッションの有効期限は1800秒(30分)となっています。

<session-config>要素による有効期限の設定

次に有効期限を設定してます。全てのセッションのデフォルトの有効期限を設定するには、web.xmlにて<session-config>要素を使って指定します。

下記のように定義されています。

<xsd:complexType name="session-configType">
  <xsd:sequence>
    <xsd:element name="session-timeout" type="j2ee:xsdIntegerType" minOccurs="0">
    </xsd:element>
  </xsd:sequence>
</xsd:complexType>

子要素として<session-timeout>要素を0回または1回指定します。<session-timeout>要素には有効期限を分数で指定します。(秒ではなく分ですので注意してください)。

<web-app>
  <session-config>
    <session-timeout>
      有効期限の分数
    </session-timeout>
  </session-config>
</web-app>

デフォルトのセッションの有効期限ではなく、個別のセッションに対する有効期限を設定するには「HttpSession」インターフェースで定義されている"setMaxInactiveInterval"メソッドを使います。

Specifies the time, in seconds, between client requests before the
servlet container will invalidate this session. A negative time 
indicates the session should never timeout. 

Parameters:
  interval - An integer specifying the number of seconds

サンプルプログラム

では試してみます。

web.xmlファイルは下記のようにしました。セッションのデフォルトの有効期限を3分にしています。

<?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>SessionTest6</servlet-class>
  </servlet>

  <servlet>
    <servlet-name>setinterval</servlet-name>
    <servlet-class>SetInterval6</servlet-class>
  </servlet>

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

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

  <session-config>
    <session-timeout>3</session-timeout>
  </session-config>
</web-app>

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

SessionTest6.java

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

public class SessionTest6 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);
    }

    int intervalTime = session.getMaxInactiveInterval();

    out.println("<p>");
    out.println("現在のデフォルトの有効期限は" + intervalTime + "秒です<br>");
    out.println("</p>");

    out.println("<a href=\"/session/setinterval\">有効期限を20秒へ</a>");

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

SetInterval6.java

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

public class SetInterval6 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>");
    }else{
      session.setMaxInactiveInterval(20);

      int intervalTime = session.getMaxInactiveInterval();

      out.println("<p>");
      out.println("現在のセッションの有効期限は" + intervalTime + "秒です<br>");
      out.println("</p>");
    }

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

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

セッションの有効期限

セッションの有効期限がweb.xmlで設定した3分(180秒)に変更されています。次に「有効期限を20秒へ」をクリックして下さい。

セッションの有効期限

特定のセッションの有効期限も変更することが出来ました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。