Struts2を使ったWEBサイト開発

ログイン編

WEB画面でよく必要となるのはログイン機能です。本章では、ログイン画面とログイン後のセッション管理を実現する方法について説明します。

 

LoginInterceptor.javaの作成

 いよいよ、本章のメイン部分であるLoginInterceptorクラスです。
 LoginInterceptor.javaに以下の記述をします。

/*
* ログインインターセプター
*/
package pkg.sample;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ValidationAware;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/*
* ログイン処理を実現したインターセプター
*/
public class LoginInterceptor extends AbstractInterceptor {
  private static final long serialVersionUID = 1L;
  public void init() {}
  public void destroy () {}
  public String intercept(ActionInvocation invocation) throws Exception {
   // 通常、セッション取得は以下の方法でできますが、
   //   Map<String, String> session = ActionContext.getContext().getSession();
   // ここでは、低レベルなクラス(HttpSession)を使って、セッションを取得しています。
   HttpServletRequest request = ServletActionContext.getRequest();
   HttpSession session = ServletActionContext.getRequest().getSession();
   // URLパラメタのuseridとpasswdを取得。
   String userid = request.getParameter("userid");
   String passwd = request.getParameter("passwd");
   if ( userid != null && passwd != null ){
    // useridとpasswdパラメタの指定があった場合には、ログイン画面での
    // 認証チェックとみなして、認証チェック処理を行う。
     UserDAO userdao = UserDAO.getInstance();
     UserBean user = userdao.select( userid );
     if ( null != user && user.getPasswd().equals(passwd) ){
      // ユーザIDが存在しており、かつパスワードも一致していたら認証OK
      // 既存セッションを破棄し、新規セッションを取得。
      // (セッション固定攻撃を回避するため)
      // 新規セッションに、useridを設定する。
      ServletActionContext.getRequest().getSession(true).invalidate();
      HttpSession newsession = ServletActionContext.getRequest().getSession(true);
      newsession.setAttribute("userid", userid );
      // メニュー画面に遷移する。
      return "mainmenu";
     } else {
      // ユーザ認証NGの場合は、エラーメッセージを設定してログイン画面に遷移。
      // ここで設定したメッセージは、JSP内に<s:actionerror /> を記述することで
      // 出力可能。
      if ( invocation.getAction() instanceof ValidationAware){
       ((ValidationAware) invocation.getAction()).addActionError( "userid または password が違います。");
      }
      return "login";
     }
  } else {
    // useridとpasswdパラメタの指定がない場合(つまり通常画面の場合)
    if ( null == session.getAttribute("userid") ){
     // 通常画面へのアクセスなのに未ログインの場合には、
     // ログイン画面に遷移する。
     return "login";
    } else {
      // ログイン済みの場合には、以後のinterceptor処理に進む。
      return invocation.invoke();
    }
   }
  } /* end of intercept() */
}

(1) 割り込み処理は、interceptメソッドに記述します。
 
(2) ログイン処理は、大きく以下の3パターンに分かれます。
  a) ログイン画面から、ユーザID(userid)とパスワード(passwd)が渡されてきた場合。
  b) ユーザID(userid)やパスワード(passwd)が存在せず、セッションにuseridも格納されていない場合。
  c) ユーザID(userid)やパスワード(passwd)は存在しないが、セッションにuseridが格納されている場合。
 
(3) 処理a)の場合には、「useridが存在しているか」「パスワードが一致しているか」をチェックし、 認証OKであれば、新しいセッションを作成してuseridを設定し、「return "mainmenu";」とすることにより、「mainMenu.action」に遷移します。
認証NGであれば、「return "login";」とすることにより、「index.jsp」に遷移します。
 
(4) 処理b)の場合は、認証がされていないケースですので、「return "login";」とすることにより、「index.jsp」に遷移します。
このケースは、ログイン認証していない状態で、直接、特定画面のURLを呼び出した場合などに発生します。
 
(5) 処理c)の場合は、認証OKですので「return invocation.invoke();」とすることにより、以後のinterceptor処理や、 Actionクラスの処理に進みます。
 
(6) ログイン画面にエラーメッセージを出力するには、addActionError()メソッドを使います。
addActionError()メソッドでエラーメッセージを設定しておくと、JSP中に<s:actionerror />タグ を記述することでエラーメッセージを出力できます。

 

最後に

・現状のZero Configuration (code behindプラグイン)では、各アクションクラスに毎回 「ParentPackageアノテーション」を指定しないと正常動作しません。
少々面倒なのですが、これは今後(多分きっと)見直しがされて、いちいち記述する必要がなくなるかもしれません。
それまではこの面倒に耐えましょう。
・この章を記述するにあたり、Creating a Login Interceptor in Struts 2 を参考にさせていただきました。

このサイトは、k2-s.comが提供するHTMLテンプレートを使用しています。
Copyright (C) 2007 まえば
トップ
セットアップ編
こんにちは編
参照画面編
更新画面編
Validation編
Struts Tags編 (未稿)
ログイン編