Submissão repetida de formulários: não concluído uma vez, solicite a página do formulário -> depois envie o processo do formulário para concluir o envio de dados
A causa raiz: não fazê -lo integralmente, solicite a página do formulário -> e envie o processo de formulário.
Causa envios repetidos:
Nota: Depois de recuar, atualize a página do formulário e envie novamente. Neste momento, em vez de repetir o envio, uma nova solicitação é enviada. De acordo com o Firefox, a operação de repetir o envio ao mesmo endereço é inválida.
Caso:
@WebServlet ("/trans") Classe pública TransferServlet estende HttpServlet {private estático final serialversionuid = 1L; Serviço de void protegido (httpServletRequest req, httpServletResponse resp) lança servletexception, ioexception {req.setcharacterencoding ("utf-8"); resp.SetContentType ("Text/html; charset = utf-8"); PrintWriter out = resp.getWriter (); String Money = req.getParameter ("Money"); // simular atraso na rede tente {thread.sleep (3000); } catch (interruptedException e) {e.printStackTrace (); } System.out.println ("Valor transferido:"+dinheiro); out.print ("Valor transferido:"+dinheiro); }}Sob o ponto maluco, você descobrirá que a página JSP não mudará, mas você pode ver através da impressão em segundo plano e será produzida continuamente, indicando que está sendo executado o tempo todo
Solução:
Antes de enviar a garantia, você deve primeiro solicitar a interface do formulário. O princípio é o mesmo que o Código de Verificação .--- Mecanismo de token
Ao solicitar a primeira vez, ao solicitar a interface do formulário, crie um token. Ao clicar na transferência e enviar a solicitação, traga este token e envie -o para a próxima interface. Verifique o token no servlet. Este token é um na sessão e um na forma. A equalização significa que o formulário está correto e o token nesta sessão é destruído.
Código na página JSP
<% // Crie token string token = java.util.uuid.randomuuid (). ToString (); // uma das sessões existe e, em seguida, faça uma sessão de julgamento.SetAttribute ("Token_in_Session", token); %> <H3> Transferir interface </h3> <form action = "/trans" method = "post"> <input type = "hidden" name = "token" value = "<%= token%>"/> Valor de transferência: <input type = "text" name = "dinheiro" "" 1 "requerido/> <br/> <input = type =" sndest = "sndest =" srim "=" dinheiro "" 1 "" 1 "/> <br/<br) <input =" sndest = "sndest =" srim "=" dinheiro "" "1" "/> <br/> <input =" "Código no TransferServlet
@WebServlet ("/trans") Classe pública TransferServlet estende HttpServlet {private estático final serialversionuid = 1L; Serviço de void protegido (httpServletRequest req, httpServletResponse resp) lança servletexception, ioexception {req.setcharacterencoding ("utf-8"); resp.SetContentType ("Text/html; charset = utf-8"); PrintWriter out = resp.getWriter (); // Obtenha o valor do token no formulário string token = req.getParameter ("token"); // Obtenha o valor do token na sessão String sessionToken = (String) req.getSession (). GetAttribute ("token_in_session"); // O token na sessão é fácil de estar vazio porque o token na sessão é um destrutível se (token.equals (sessionToken)) {// indica que o token é o mesmo req.getSession (). Removeattribute ("token_in_session"); String Money = req.getParameter ("Money"); System.out.println ("Valor da transferência:"+dinheiro); out.print ("Valor da transferência:"+dinheiro); // Finalmente destruir o token na sessão} // Se o token for diferente, significa que é um envio repetido e não pode ser enviado}}Então, para não aparecer no código Java no arquivo JSP, crie e pular o token em outro servlet
@WebServlet ("/transfer") classe pública copyoftransferServlet estende httpServlet {private static final long serialversionUid = 1L; Serviço de void protegido (httpServletRequest req, httpServletResponse resp) lança servletexception, ioexception {// crie o token e pular para enviar.jsp string token = uuid.randomuuid (). tostring (); System.out.println (token); req.getSession (). SetAttribute ("token_in_session", token); req.setAtattribute ("token", token); req.getRequestDispatcher ("/Views/Repetsubmit/submit.jsp"). Forward (req, resp); }}É assim que o arquivo JSP se parece agora
<H3> Transferir interface </h3> <formulário de ação = "/trans" Method = "post"> <input type = "hidden" name = "token" value = "$ {token}"/> Valor de transferência: <input type = "text" name = "money" min = "1 requerir/> <br//<br//<but type =" sndest "", "name =" dinheiro "" "1" 1 <br/> <br/<brate type = "sndest" "É muito mais limpo que o acima e mais elegante, mas ainda não parece bom, porque se você precisar usá -lo em outros lugares, precisará criar tokens, verificar tokens e excluir tokens, para extraí -lo para fazer uma classe de ferramentas
Tokenutil.java
// Classe de ferramenta token // Crie token // Verifique o token // Destroy Token Public Class Tokenutil {private final Static String token_in_session = "token_in_session"; public static void Savatoken (httpServletRequest req) {string token = uuid.randomuuid (). tostring (); System.out.println (token); req.getSession (). SetAttribute (token_in_session, token); req.setAtattribute ("token", token); } public estático booleano validateToken (httpServletRequest req, string tokeninRequest) {// obtenha o valor do token no sessiontring sessionToken = (string) req.getSession (). getAttribute (token_in_session); if (tokeninRequest.equals (sessionToken)) {req.getSession (). removeattribute (token_in_session); retornar true; } retornar false; }}Isso está bem. O usuário só precisa chamar essa classe de ferramenta e não há necessidade de escrever uma série de operações, como a criação de um token.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.