セッションを使ったカスタム認証(ログアウト処理)

広告

一度認証に成功してからいつまで認証が有効かについては、セッションを利用している関係でセッションの有効期限までとなっています。セッションの有効期限が切れる前に任意のタイミングでログアウトできるように変更してみましょう。

ログアウトの処理は、セッションを無効にすればいいだけです。そこで認証で保護された各サーブレットに「Logout」サーブレットへのリンクを設定し、クリックされた「Logout」サーブレット内でセッションを無効にしてみます。

HttpSession session = request.getSession(true);
session.invalidate();

response.sendRedirect("/auth/Login");

セッションを無効にした後は「Login」サーブレットを呼び出すようにします。

実際に試してみる

「Logout」サーブレットは次のようになります。

Logout1.java

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

public class Logout1 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(true);
    session.invalidate();

    response.sendRedirect("/auth/Login");
  }
}

認証で保護されている「CustomAuth3」サーブレットを次のように作成します。

CustomAuth3.java

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

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

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

    String target = request.getRequestURI();

    HttpSession session = request.getSession(false);

    if (session == null){
      /* まだ認証されていない */
      session = request.getSession(true);
      session.setAttribute("target", target);

      response.sendRedirect("/auth/Login");
    }else{
      Object loginCheck = session.getAttribute("login");
      if (loginCheck == null){
        /* まだ認証されていない */
        session.setAttribute("target", target);
        response.sendRedirect("/auth/Login");
      }
    }

    out.println("<html>");
    out.println("<head>");
    out.println("<title>ユーザー認証テスト</title>");
    out.println("</head>");
    out.println("<body>");

    out.println("<p>テストページ1</p>");

    out.println("<p><a href=\"/auth/CustomAuth2\">テストページ2へ</a></p>");

    out.println("<p><a href=\"/auth/Logout\">ログアウト</a></p>");

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

ほぼ同じ内容の「CustomAuth4」サーブレットを次のように作成します。

CustomAuth4.java

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>CustomAuth1</servlet-name>
    <servlet-class>CustomAuth3</servlet-class>
  </servlet>

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

  <servlet>
    <servlet-name>CustomAuth2</servlet-name>
    <servlet-class>CustomAuth4</servlet-class>
  </servlet>

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

  <servlet>
    <servlet-name>Login</servlet-name>
    <servlet-class>Login2</servlet-class>
  </servlet>

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

  <servlet>
    <servlet-name>LoginCheck</servlet-name>
    <servlet-class>LoginCheck2</servlet-class>
  </servlet>

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

  <servlet>
    <servlet-name>Logout</servlet-name>
    <servlet-class>Logout1</servlet-class>
  </servlet>

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

それでは一度サーブレットを再起動してから、ブラウザで「http://localhost:8080/auth/CustomAuth1」へアクセスして下さい。

カスタム認証

「CustomAuth1」サーブレットへアクセスしてもセッションに必要な情報が保存されていませんので「Login」サーブレットへリダイレクトされます。今回もログインフォームが表示されます。

データベースに登録されているユーザー名「itou」とパスワード「itou」と値を入力してから「login」ボタンをクリックして下さい。

カスタム認証

今度は「ログアウト」へのリンクが表示されます。では「ログアウト」をクリックして下さい。

カスタム認証

ログアウトの処理としてセッションが無効になったあとでログイン画面が表示されます。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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