Seasar2 + SAStrutsでログイン処理
2014.09.20
今回の技術ブログ担当の久保です。
Seasar2勉強の一環として実施した、ログイン機能の実装について纏めておきたいと思います。
1.方針
・(制限)DBでID、PWD管理する。
・機能毎にログインチェックを実装したくない。
2.実装:ログイン処理
兎にも角にも先ずログイン機能を実装しました。JSP→Action→Service→Dao→(DB)の構成です。ログインOKの場合はユーザ情報をセッションで持ち回るようにしました。
・Action
package xxx.action; public class LoginAction { @ActionForm @Resource protected LoginForm loginForm; @Resource protected LoginService loginService; @Execute(validator = false) public String index() { return "login.jsp"; } @Execute(validator = true, validate = "validateLogin", input = "login.jsp") public String login() throws Exception { if(loginService.login(loginForm.userId, loginForm.pwd)){ return "/index?redirect=true"; }else{ throw new ActionMessagesException("LOGIN NG!", false); } } }
・Service
package xxx.service; public class LoginService { @Resource protected LoginDao loginDao; @Resource protected LoginDto loginDto; public boolean login(String userId, String pwd) { LoginEntity loginEntity = loginDao.selectByIdPwd(userId, pwd); if(loginEntity == null){ return false; }else{ Beans.copy(loginEntity, loginDto).execute(); return true; } } public boolean isLoginOK(){ return loginDto.userId == null ? false : true; } }
・DTO
package xxx.dto; @Component(instance = InstanceType.SESSION) public class LoginDto implements Serializable { private static final long serialVersionUID = 1L; public String userId; public String userName; }
3.実装:インターセプター
機能毎に都度ログインチェックを行いたくなかったため、インターセプターを用意して各Actionを呼ぶ前にここでログインチェックをするようにしました。最初Actionだけチェックするようにするにはどうすればよいのか?と思いましたが、調べたら割と簡単に出てきました、@Executeアノテーションが付与されたメソッドであるかチェックすれば良かったのですね。
package xxx.interceptor; public class LoginInterceptor extends AbstractInterceptor { @Resource protected LoginService loginService; @Override public Object invoke(MethodInvocation invocation) throws Throwable { if(invocation.getMethod().isAnnotationPresent(Execute.class)){ if(! loginService.isLoginOK()){ return "/login/index"; } } return invocation.proceed(); } }
4.インターセプター登録
最後にインターセプタの登録、customizer.diconのactionCustomizerにaddCustomizerを追加しました。最初LoginActionを対象から除外することをすっかり忘れてしまい、見事に引っ掛かってしまいました。
・customizer.dicon
(中略) <component name="actionCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain"> <initMethod name="addCustomizer"> <arg> <component class="org.seasar.framework.container.customizer.AspectCustomizer"> <property name="interceptorName">"loginInterceptor"</property> <property name="useLookupAdapter">true</property> <initMethod name="addIgnoreClassPattern"> <arg>"xxx.action"</arg> <arg>"LoginAction"</arg> </initMethod> </component> </arg> </initMethod> </component>
CONTACT
お問い合わせ
あなたの「想い」に挑戦します。
どうぞお気軽にお問い合わせください。
受付時間:平日9:00〜18:00 日・祝日・弊社指定休業日は除く