アウトプットができる技術者に

it's a time to take a new step !

Struts2 入門 LoginInterceptor 実装サンプル

  • Interceptor の 実装サンプルとして、Login認証を interceptor として実装
  • ここでは、convention plugin を導入前提として書いている
サンプル処理の流れ

1. ユーザーによる http request
2. struts.xml の設定に従い、request 先の action に Login Interceptor の対象か否かチェック
3. 2で対象の場合、Login Interceptor が intercept して Login認証を実施
4. 最初は確実にエラーなので、Login画面(login.jsp)に遷移
5. Login画面で ID/PW を入力
6. Login interceptor が 処理を横取りして認証
7. 認証が正しければ、LoginActionを実行
8. LoginAction から Main.Action にリダイレクト

  • struts.xml に interceptorの定義を追記
<struts>
    <package name="default" extends="convention-default">
        <interceptors>
            <interceptor name="login" class="foo.interceptors.LoginInterceptor" />
            <interceptor-stack name="myStack">
                <interceptor-ref name="login"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="myStack"/>
    </package>
</struts>
  • interceptor の対象とする action クラスに packageを適応する
@ParentPackage("default")
@Result(name="login", location="login.jsp")
public class Basic extends ActionSupport {
}
public class LoginInterceptor extends AbstractInterceptor {
    public String intercept(ActionInvocation invocation) throws Exception {
        if(isLogin()){
            return invocation.invoke();
        } else {
            return "login";
        }
    }
    private boolean isLogin(){
        // login validation codes here
    }
}
<s:form action="login">
    <s:textfield key="id"/>
    <s:password key="password" />
    <s:submit/>
</s:form>
@Result(name="main", location="main.action", type="redirect")
public class Login extends Basic{
	public String execute() throws Exception {
		return "main";
    }
}
課題
  • どんなURLでアクセスしても必ずmain.action = main.jsp に遷移してしまう
    • sessionに URI を保持してい対応できるかも?
  • interface に認証ロジックがあるのが少し気持ち悪い
    • おそらくLoginのActionファイルに書き換え可能