1, установите переменную и разрешите отправку только один раз.
<script Language="javascript">
вар checkSubmitFlg = false;
функция checkSubmit() {
if (checkSubmitFlg == true) {
return false;
}
checkSubmitFlg = true;
return true
}
document.ondblclick = function docondblclick() {
window.event .returnValue = false
}
document.onclick = function doconclick() {
if (checkSubmitFlg) {
window.event.returnValue = false
}
</script>
;
<html:form action="myAction.do" Method="post" onsubmit="return checkSubmit();">
2 Все еще используя JavaScript, отключите кнопку отправки или изображение
<html:form action="myAction.do" метод = "post"
onsubmit = "getElById('submitInput').disabled = true; return true;">
<html:image styleId="submitInput" src="images/ok_b.gif" border="0" />
< / html:form>
3. Использование механизма токенов синхронизации Struts
для решения проблемы повторных отправок данных в веб-приложениях. Struts также предоставляет эталонную реализацию.
Основной принцип:
перед обработкой входящего запроса сервер сравнивает значение токена, содержащееся в запросе, со значением токена, сохраненным в текущем сеансе пользователя, чтобы увидеть, есть ли совпадение. После обработки запроса и до отправки ответа клиенту будет сгенерирован новый токен. Этот токен не только будет передан клиенту, но и заменит старый токен, сохраненный в сеансе пользователя. Таким образом, если пользователь вернется на предыдущую страницу отправки и повторит отправку, токен, переданный клиентом, будет несовместим с токеном на стороне сервера, что эффективно предотвратит повторную отправку.
if (isTokenValid(request, true)) {
// ваш код
return Mapping.findForward("success"
} else {
saveToken(request);
return Mapping.findForward("submitagain" }
Struts
на основе сеанса пользователя
;ID и текущее системное время используются для создания уникального (для каждого сеанса) токена. Для конкретной реализации обратитесь к методуgenerToken() в классе TokenProcessor.
1. //Проверка токена управления транзакцией. <html:form> автоматически сгенерирует неявный репрезентативный токен ввода на основе идентификатора в сеансе, чтобы предотвратить двойную отправку.
2. В действии:
//<input type="hidden" name ="org.apache.struts.taglib.html.TOKEN"
// value="6aa35341f25184fd996c4c918255c3ae">
if (!isTokenValid(request))
error.add(ActionErrors.GLOBAL_ERROR,
new ActionError("error.transaction.token") ) ;
resetToken(request); //Удалить токен в сеансе
3. В действии есть метод для создания
защищенной токена StringgenerateToken(HttpServletRequest request) {
HttpSession session = request.getSession();
try {
byte id[] = session.getId; ().getBytes();
byte now[] =
new Long(System.currentTimeMillis()).toString().getBytes();
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(id)
md
;.update(сейчас);
return (toHex(md.digest()));
} catch (IllegalStateException e) {
return (null)
; catch (NoSuchAlgorithmException e) {
return (null }
}
;