LoginInterceptor.java
LoginInterceptorのinterceptメソッドは、次のようになります。
public String intercept(ActionInvocation invocation) throws Exception {
// HttpServletRequest、HttpSessionの取得
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = ServletActionContext.getRequest().getSession();
// (1) ログインしていれば、次のインターセプターへ
if ( session.getAttribute("userid") != null &&
session.getAttribute("userid").equals("part4") ){
return invocation.invoke();
}
// (2) リクエストパラメーターのuseridとpasswordを取得
String userid = request.getParameter("userid");
String passwd = request.getParameter("password");
System.out.println(userid);
System.out.println(passwd);
if ( userid != null && passwd != null &&
userid.equals("part4") && passwd.equals("wings") ) {
// (3) 新たなセッションにuseridを設定する
ServletActionContext.getRequest().getSession(true).invalidate();
HttpSession newsession = ServletActionContext.getRequest().getSession(true);
newsession.setAttribute("userid", userid );
return "login-success";
}
return "login";
}
まず、今回のログイン処理は、ユーザーIDが「part4」でパスワードが「wings」であれば、認証OKとしています。実際のアプリケーションでは、ログイン情報をDBと照合するところですが、ここでは固定の文字列との比較としました。
(1)の処理は、セッションのuseridオブジェクトが「part4」であれば、認証済みと判断して、次のインターセプターへ遷移するようにしています。
(2)は、リクエストパラメーターを取得しています。このパラメータが設定されるときは、ログイン画面からSubmitされた直後ということになります。
(3)は、ログイン認証がOKの場合の処理です。これまでのセッションを破棄して新たなセッションを生成し、useridオブジェクトにユーザーIDを設定しています。最後に、結果コードとして、login-successを返します。
前述したとおり、インターセプターから直接結果コードを返すようにすると、Actionクラスの処理はスキップされて、次の処理に移ります。
login.jsp
login.jspは、次のようになります。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>ログイン</title> </head> <body> <s:form action="Login" > <s:textfield label="ユーザーID" name="userid" /> <s:password label="パスワード" name="password" /> <s:submit value="ログイン" /> </s:form> </body> </html>
<s:password>タグは、<input type="password">と同様です。なお、今回のログイン画面では、バリデーション処理は省略しました。
Login.java
Login.javaは、次のように、executeメソッドでsuccessを返しているだけです。
public class Login {
public String execute() throws Exception {
return "success";
}
}
実行結果
実行させると、前述したとおりの結果になるはずですが、さらにコンソールの表示にも注目してください。コンソールには、リクエストパラメータや、LoginInterceptor、Actionの結果コードが表示されています。

これは、最初のSimpleInterceptorと、LoginInterceptorで、System.out.printlnメソッドから出力している文字列です。
まとめ
Struts 2であらかじめ定義されたインターセプターについては、本稿では個別にとりあげませんでした。それらのうち、バリデーションのような重要な機能については、次回以降の解説で触れる予定です。
今回のインターセプターは、MVCモデルで言うと、Cのコントローラーにあたる部分でした。次回は、MVCのV、Viewについて解説することにしましょう。
参考資料
- Apache Struts
- Struts2を使ってみる
- ITの現場-Java,Flex,Strus2,Spring2,Hibernate3,Ajax,PHP
- 『Struts2入門』 川崎克巳 著、オンライン書籍、2007年10月
- 『Practical Apache Struts 2 Web 2.0 Projects』 Ian Roughley 著、Apress、2007年11月
