session防止表单重复提交

本文介绍了一种防止Web表单重复提交的方法,通过客户端生成唯一令牌并与服务器端进行验证对比来确保同一表单不会被重复处理。具体实现包括生成令牌、表单提交处理及服务器端验证等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html>
   <head>
     <title>RepeateForm.html</title>
 
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
     <meta http-equiv="description" content="this is my page">
     <meta http-equiv="content-type" content="text/html; charset=UTF-8">
     
     <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
     <script type="text/javascript">
     var iscommitted = false;
     function checkPost(){
       if(!iscommitted){
           document.getElementById("sub").disabled =turn; 
           iscimmitted = turn;
           return trun;      
       }else{
         //  alert("不能重复提交表单!");
           return false;      
         }
     }
     </script>
   </head>
   
   <body>
     <form action="/BookHistory/serlevt/RepeateFormServlet" method="poss" onsubmit="return checkPost()">
     用户名:<input type="text" name="username" /><br>
       <input type="submit" value="提交" id="sub"/>
     </form>
   
   </body>
 </html>
 



package com.hbsi.servlet;
 
import java.io.IOException;
 import java.io.PrintWriter;
 
import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
public class FormDealServlet extends HttpServlet {
 

public void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 /* String client_token = request.getParameter("token");
 
if(client_token==null){
 return false;*/
 boolean b = isTokenValidate(request);
 if(!b){
 System.out.print("请不要重复提交");
 return;
 }
 request.getSession().removeAttribute("token");
 System.out.print("项数据库注册用户信息。。。");
 
}
 


    private boolean isTokenValidate(HttpServletRequest request){
     String client_token = request.getParameter("token");
 
if(client_token==null){
 return false;
     
     }
 String server_token=(String) request.getSession().getAttribute("token");
 if(server_token==null){
 return false;
 
}
 if(!client_token.equals(server_token)){
 return false;
 }
 return true;
   }
 
public void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 
}
 

}
 

package com.hbsi.servlet;
 
import java.io.IOException;
 import java.io.PrintWriter;
 
import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
public class ForeGenerateServlet extends HttpServlet {
 
public void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 response.setContentType("text/heml;charset=UTF-8");
 PrintWriter out = response.getWriter();
 //产生表单号
 TokenProcessor tp = TokenProcessor.getInstance();
 String token= tp.generateToken();
 request.getSession().setAttribute("token", token); 
 
out.print("<form action='/BookHistory/servlet/FormDealServlet' method='post'/>");
 out.print("<input type='hidden' name='token' value='"+token+"'/>");
 out.print("用户名:<input type='text' name='username'/>");
 out.print("<input type='submit' value='提交'/>");
 out.print("</form>");
 

}
 

public void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 

}
 


}
 

package com.hbsi.servlet;
 
import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.Random;
 
import sun.misc.BASE64Encoder;
 
public class TokenProcessor {
 private TokenProcessor(){
 
}
 
private static final TokenProcessor instance=new TokenProcessor();
 
public static TokenProcessor getInstance(){
 return instance;
 }
 public String generateToken(){
 int i= new Random().nextInt();
 String token= System.currentTimeMillis()+i+"";
 try {
 MessageDigest md=MessageDigest.getInstance("md5");
         
 byte[]md5 = md.digest(token.getBytes());
         
 //base64编码
 BASE64Encoder encoder = new BASE64Encoder(); 
 encoder.encode(md5);
 
//return new String(md5);
           
 } catch (NoSuchAlgorithmException e) {
 // TODO Auto-generated catch block
 //e.printStackTrace();
 throw new RuntimeException(e);
 }
 return null;
 }
 


}
 


package com.hbsi.servlet;
 
import java.io.IOException;
 import java.io.PrintWriter;
 
import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
public class RepeateFormServlet extends HttpServlet {
 
public void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 response.setContentType("text/html;charset=UTF-8");
 PrintWriter out = response.getWriter();
 
String username = request.getParameter("username");
 
try {
 Thread.sleep(5*1000);
 } catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 out.print("以处理你的信息");
 System.out.println("向数据库注册信息……");
 

}
 

public void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 doGet(request,response);
 

}
 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值