Используя каркас веб-приложения Struts, мы можем решить эту проблему следующим образом:
В 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()
в классе действия он будет проверять отправленный ключ токена (скрытое поле) с ключом токена, сохраненным ранее по запросу / сеансу.Если совпадение, он вернет истину.
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);
}
ссылка