TECHBLOGスキルブログ

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>

              

OTHER CONTENTSその他のコンテンツ

UNITRUST会社を知る

  • 私たちについて

  • 企業情報

SERVICE事業内容

  • システム開発

CONTACT
お問い合わせ

あなたの「想い」に挑戦します。

どうぞお気軽にお問い合わせください。

受付時間:平日9:00〜18:00 日・祝日・弊社指定休業日は除く

お問い合わせ