Webアプリケーションだと、セッション(Session)でログイン情報を保持する方法をよくとる。
今回は、SAStrutsでログイン処理+セッション保持を紹介する。
たぶん、このやり方が一般的かと思う。
■はじめに
今回、Eclipse→Dolteng→SAStruts→S2JDBCで開発するので、その辺を注意。
プロジェクト名が「LoginSample」とする。
ベースURLが「http://localhost:8080/LoginSample/」とする。
ベースパッケージが「biz.mikuriya」とする。
■大まかな手順
いくつかのプログラム開発、設定ファイル編集を行なうと、
ログイン処理+セッション保持が可能になる。
以下の手順で作業を進める。
・ユーザーデータクラスを作成
・アクションフォームクラスを作成
・アクション(ページ構成)を作成
・アクションに合ったJSPを作成
・ログイン処理+セッション保持処理用のクラスを作成
・customizer.diconを編集
・動作確認
■ユーザーデータクラスを作成
メールアドレスだけをセッションに保持しておきたいので、
ユーザーデータクラスは、以下のように作成。
biz.mikuriya.dto.UserDto.java
package biz.mikuriya.dto;
import java.io.Serializable;
import org.seasar.framework.container.annotation.tiger.Component;
import org.seasar.framework.container.annotation.tiger.InstanceType;
@Component(instance = InstanceType.SESSION)
public class UserDto implements Serializable {
private static final long serialVersionUID = 1L;
public String email;
}
■アクションフォームクラスを作成
メールアドレスとパスワードの入力によるログイン処理が行なわれるため、
それ用の入力チェックデータクラスを作成。
biz.mikuriya.form.UserForm.java
package biz.mikuriya.form;
import org.seasar.struts.annotation.EmailType;
import org.seasar.struts.annotation.Maxlength;
import org.seasar.struts.annotation.Minlength;
import org.seasar.struts.annotation.Required;
public class UserForm {
@Required
@EmailType
public String email;
@Required
@Minlength(minlength = 6)
@Maxlength(maxlength = 32)
public String password;
}
■アクション(ページ構成)を作成
今回は3ページ作成する。
トップページ、ログインページ、マイページの3種類を作成。
biz.mikuriya.action.IndexAction.java(トップページ)
※ログインの必要がないページ
package biz.mikuriya.action;
import javax.annotation.Resource;
import org.seasar.struts.annotation.Execute;
import biz.mikuriya.dto.UserDto;
public class IndexAction {
@Resource
public UserDto userDto;
@Execute(validator = false)
public String index() {
return "index.jsp";
}
}
biz.mikuriya.action.LoginAction.java(ログインページ)
※ログインの必要がないページ
package biz.mikuriya.action;
import javax.annotation.Resource;
import org.seasar.framework.beans.util.Beans;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;
import biz.mikuriya.dto.UserDto;
import biz.mikuriya.form.UserForm;
public class LoginAction {
@Resource
@ActionForm
public UserForm userForm;
@Resource
protected UserDto userDto;
@Execute(validator = true, input = "/login/index.jsp")
public String index() {
// セッションへの保存処理
// userDtoに値を入れるだけでSessionに保存される
Beans.copy(this.userForm, this.userDto).execute();
return "/mypage/?redirect=true";
}
}
biz.mikuriya.action.MypageAction.java(マイページ)
※ログインが必要なページ
package biz.mikuriya.action;
import javax.annotation.Resource;
import org.seasar.struts.annotation.Execute;
import biz.mikuriya.dto.UserDto;
public class MypageAction {
@Resource
public UserDto userDto;
@Execute(validator = false)
public String index() {
return "index.jsp";
}
}
■アクションに合ったJSPを作成
前項で作成したActionに一致したJSPファイルを作成。
/WEB-INF/view/index.jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>トップページ</title>
</head>
<body>
<h1>トップページ</h1>
メールアドレス<br/>
ここに表示「<b>${userDto.email}</b>」<br/>
<br/>
<a href="<c:url value="/"/>">トップページ</a>|<a href="<c:url value="/login/"/>">ログインページ</a>|<a href="<c:url value="/mypage/"/>">マイページ</a>
</body>
</html>
/WEB-INF/view/login/index.jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>ログインページ</title>
</head>
<body>
<h1>ログインページ</h1>
<html:errors/>
<s:form action="/login/">
メールアドレス<html:text property="email" /><br/>
パスワード<html:password property="password" /><br/>
<br/>
<html:submit value="ログイン"/>
</s:form>
<br/>
<a href="<c:url value="/"/>">トップページ</a>|<a href="<c:url value="/login/"/>">ログインページ</a>|<a href="<c:url value="/mypage/"/>">マイページ</a>
</body>
</html>
/WEB-INF/view/mypage/index.jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>マイページ</title>
</head>
<body>
<h1>マイページ</h1>
<b>これがマイページ</b><br/>
メールアドレス<br/>
ここに表示「<b>${userDto.email}</b>」<br/>
<br/>
<a href="<c:url value="/"/>">トップページ</a>|<a href="<c:url value="/login/"/>">ログインページ</a>|<a href="<c:url value="/mypage/"/>">マイページ</a>
</body>
</html>
■ログイン処理+セッション保持処理用のクラスを作成
重要ポイントとなるログイン処理クラスを作成。
biz.mikuriya.interceptor.LoginConfirmInterceptor.java
package biz.mikuriya.interceptor;
import javax.annotation.Resource;
import org.aopalliance.intercept.MethodInvocation;
import org.seasar.framework.aop.interceptors.AbstractInterceptor;
import org.seasar.struts.annotation.Execute;
import biz.mikuriya.dto.UserDto;
public class LoginConfirmInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 1L;
@Resource
protected UserDto userDto;
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
// ここの条件がtrueであればログイン済みと判断
// ここの条件がfalseであればログインページへ移動
return (!isExecuteMethod(invocation) || isLoggedIn()) ? invocation
.proceed() : "/login/";
}
private boolean isExecuteMethod(MethodInvocation invocation) {
return invocation.getMethod().isAnnotationPresent(Execute.class);
}
private boolean isLoggedIn() {
// Sessionにユーザー情報が登録されているかチェック
return (userDto != null && userDto.email != null);
}
}
■customizer.diconを編集
これも重要ポイントとなるログイン処理を有効にするための設定ファイル
これを編集する。
MypageActionだけをセッションチェックしたいので、addClassPatternで登録する
customizer.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components>
<include path="default-customizer.dicon"/>
<component name="formCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain"/>
<component name="actionCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain">
<initMethod name="addAspectCustomizer">
<arg>"aop.traceInterceptor"</arg>
<!-- ここ重要(追加必須) -->
<arg>true</arg>
</initMethod>
...(中略)...
<!-- SESSIONのチェック設定はここから -->
<initMethod name="addCustomizer">
<arg>
<component class="org.seasar.framework.container.customizer.AspectCustomizer">
<property name="interceptorName">"loginConfirmInterceptor"</property>
<!-- ここ重要(追加必須) -->
<property name="useLookupAdapter">true</property>
<!-- このActionだけセッションチェックを行なう -->
<initMethod name="addClassPattern">
<arg>"biz.mikuriya.action"</arg>
<arg>"MypageAction"</arg>
</initMethod>
</component>
</arg>
</initMethod>
<!-- SESSIONのチェック設定はここまで -->
</component>
...(省略)...
</components>
「ここ重要」とコメントにした部分は、とても重要。
以下のURLに書かれているように、HotDeploy時とCoolDeploy時では、
動作が違うので、注意すべし。
[S2Container][SAStruts] セッション格納の値について
■動作確認
実際に動作を確認する。
http://localhost:8080/LoginSample/
セッションがない状態でマイページへ接続
http://localhost:8080/LoginSample/mypage/