SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

作りながら学ぶJavaアプリケーションフレームワーク

Struts 2入門(4)~インターセプターという仕組み~

作りながら学ぶJavaアプリケーションフレームワーク

LoginInterceptor.java

 LoginInterceptorinterceptメソッドは、次のようになります。

[リスト8]LoginInterceptor.javaの一部
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は、次のようになります。

[リスト9]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を返しているだけです。

[リスト10]login.javaの一部
public class Login {
    public String execute() throws Exception {
        return "success";
    }
}

実行結果

 実行させると、前述したとおりの結果になるはずですが、さらにコンソールの表示にも注目してください。コンソールには、リクエストパラメータや、LoginInterceptor、Actionの結果コードが表示されています。

図5 アプリケーション実行中のコンソール出力
図5 アプリケーション実行中のコンソール出力

 これは、最初のSimpleInterceptorと、LoginInterceptorで、System.out.printlnメソッドから出力している文字列です。

まとめ

 Struts 2であらかじめ定義されたインターセプターについては、本稿では個別にとりあげませんでした。それらのうち、バリデーションのような重要な機能については、次回以降の解説で触れる予定です。

 今回のインターセプターは、MVCモデルで言うと、Cのコントローラーにあたる部分でした。次回は、MVCのV、Viewについて解説することにしましょう。

参考資料

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
作りながら学ぶJavaアプリケーションフレームワーク連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 高江 賢(タカエ ケン)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3264 2008/11/27 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー