質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Struts 2

Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。

Q&A

1回答

6200閲覧

【Struts2】token interceptorで二重送信防止処理を設定した際の"セッション"とは?

RogerFederer

総合スコア19

Struts 2

Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。

0グッド

0クリップ

投稿2018/11/16 14:13

以下の通りtoken interceptorで二重送信防止の処理を設定していて**「1度目の送信で"invalid.token"がreturnされてしまいActionが実行できない」という事象**に遭遇しました。

XML

1<action name="TestAction" class="test.action.TestAction" method="execute"> 2 <interceptor-ref name="defaultStack"/> 3 <interceptor-ref name="token"/> 4 <result name="success">xxx.jsp</result> 5 <result name="invalid.token">yyy.jsp</result> 6</action>

JSPにも<s:token>は仕込み済みです。

しかし、1度目はしっかりとActionを実行できる場合と、1度目でもinvalid.tokenが返ってきてActionが実行できない場合と結果がまちまちであることが分かり、トリガは何かと色々と試してみると、1点気づいたことがありました。それは、

web.xmlのsession-configでsession-timeoutを1分に設定しており、二重送信防止のtokenを仕込んだボタンがある画面で1分以上待ったあとボタンを押すと、1度目にも関わらずinvalid.tokenが返ってきてしまう

ということが分かりました。1分以内に素早くボタンを押せば1度目は成功、ブラウザバックやリロードによる2度目の実行はできません。

しかし、私の頭ではなぜボタンのあるページでセッション切れ状態にすると1度目の実行でinvalid.tokenが返ってきてしまうのか辻褄が合いません。

以下サイト最後のまとめ部分に以下のように書いてありました。

https://www.journaldev.com/2281/struts2-token-interceptor-example

1. When a request is made to the update action, Struts2 tags API generates a unique token and set it to the session. The same token is sent in the HTML response as hidden field.

2.When the form is submitted with token, it is intercepted by token interceptor where it tries to fetch the token from the session and validate that it’s same as the token received in the request form. If token is found in session and validated then the request is forwarded to the next interceptor in the chain. Token interceptor also removes the token from the session.

これを読む限り、リクエストが発生(ボタンを押)したらtokenをセッションにセットするとあるので、ボタンのあるページで1分以上待ってセッションが切れようが、ボタンを押した瞬間にtokenが新たにセッションにセットされそのtokenのセッションが1分間持続することになるはずだ、そしてインターセプタがtokenをセッションから受け取れるはずだ、と思いました。

なのになぜ初回からinvalid.tokenが返ってきてしまうのか? これが理解できません。

解説をいただけると非常に助かりますm(_ _)m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

tokenInterceptorが有効なActionクラスでは、tokenが有効な値であるかをチェックしますので、全くない場合は result値が invalid.token になります。

そのため、トークンチェックを開始したい画面を表示するActionクラスでは、tokenInterceptorを有効にせず、表示するJSPでは <s:token />だけを設定します。

<s:token/>を押して実行されるActionには、tokenInterceptを有効にしておくことで、送信された一時トークンの検証を行います。

セッションの有効期限が切れてしまった場合にトークンのエラーとなる件は、<s:token/>を出力する際に発行した一時トークンの値は、 実はセッションに格納されているため、セッション切れの場合は、セッションに格納しているはずの期待トークン値が取得できず、リクエストパラメータに入るトークンの値と称号しても合わないので、invalid.tokenになります。

投稿2018/11/16 14:55

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問