Struts Web アプリケーション フレームワークを使用すると、この問題を次のように処理できます。
Struts には、 に使用する 3 つのメソッドがありtoken, saveToken(), isTokenValid() and resetToken()
ます。
saveToken()
- トークン キーを生成し、request/session 属性に保存します。
isTokenValid()
- 要求/セッションで 1 つのストアに対して送信されたトークン キーを検証します。
resetToken()
- トークン キーをリセットします。
仕組み: 1) フォームをロードすると、アクション クラスを
呼び出して、トークン キーを作成および保存します。saveToken()
Struts は、生成されたキーをリクエスト/セッションに保存します。トークンが正常に作成された場合、ブラウザでソースを表示すると、次のようなものが表示され、トークン キーが隠しフィールドとして保存されます。
<form action="myaction.do" method="post">
<input type="hidden"
name="<%= Constants.TOKEN_KEY %>"
value="<%= session.getAttribute(Action.TRANSACTION_TOKEN_KEY) %>" >
2) フォームが送信され、アクション クラスで呼び出さisTokenValid()
れると、送信されたトークン キー (隠しフィールド) が、要求/セッションで以前に保存されたトークン キーで検証されます。一致する場合は true を返します。
public final ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
saveToken(request);
if (!tokenIsValid(request)) {
//forward to error page saying "your transaction is already being processed"
} else {
//process action
//forward to jsp
}
// Reset token after transaction success.
resetToken(request);
}
参照