1 javascript, defina uma variável e permita o envio apenas uma vez.
<script language="javascript">
var
checkSubmitFlg = false;
function checkSubmit(
) {
if
(checkSubmitFlg
== true) {
return
false
;
.returnValue=
false
}
document.onclick=
function doconclick() {
if (checkSubmitFlg) {
window.event.returnValue = false
;
<html:form action="myAction.do" method="post" onsubmit="return checkSubmit();">
2 Ainda usando javascript, defina o botão de envio ou imagem para desativar
<html:form action="myAction.do" método ="post"
onsubmit="getElById('submitInput').disabled = true; return true;">
<html:image styleId="submitInput" src="images/ok_b.gif" border="0" />
< / html:form>
3 Use o mecanismo de token de sincronização do struts
para resolver o problema de envios repetidos em aplicativos da web. O Struts também fornece uma implementação de referência.
Princípio básico:
Antes de processar uma solicitação recebida, o servidor comparará o valor do token contido na solicitação com o valor do token salvo na sessão do usuário atual para ver se há uma correspondência. Após o processamento da solicitação e antes do envio da resposta ao cliente, um novo token será gerado. Além de ser repassado ao cliente, esse token também substituirá o token antigo salvo na sessão do usuário. Dessa forma, se o usuário retornar à página de envio anterior e enviar novamente, o token passado pelo cliente será inconsistente com o token do lado do servidor, evitando efetivamente envios repetidos.
if (isTokenValid(request, true)) {
// seu código aqui
return mapping.findForward("success");
else {
saveToken
(request
)
;
ID e A hora atual do sistema é usada para gerar um token exclusivo (para cada sessão). Para implementação específica, consulte o método generateToken() na classe TokenProcessor.
1.
//Verifique o token de controle da transação. <html:form> gerará automaticamente umtoken
representativo de entrada implícito com base no identificador na sessão para evitar envio duplo.
nome ="org.apache.struts.taglib.html.TOKEN"
// valor="6aa35341f25184fd996c4c918255c3ae">
if (!isTokenValid(request))
erros.add(ActionErrors.GLOBAL_ERROR,
new ActionError("error.transaction.token") ) ;
resetToken(request); //Exclui o token na sessão
3. A ação possui um método para gerar token
protegido StringgenerateToken
(HttpServletRequest request) {
HttpSession session = request.getSession()
;
()
.getBytes();
byte agora[] =
new Long(System.currentTimeMillis()).toString().getBytes(
)
;
.update(
agora);
retornar
(toHex(
md.digest(
))
)
;