Servlet、SPringMVC、Struts等防止表单重复提交的多种处理方法

第一种处理方法(非拦截器):

目前这种方法不建议,因为JSP规范不建议写JAVA代码。这种可以方便第二种处理方法的理解,第二种方法引入拦截器的思想,原理基本一样,模仿Struts的Token机制。

1、在需要防止重复的jsp中加入下面的java代码,

    <%@page import="java.util.Random"%>
    <%@page import="java.util.Set"%>
    <%@page import="java.util.HashSet"%>
     <%
        //生成一个Token,算法可以自己定,不随便重复就可以了
        Random ran = new Random();
     String formhash = String.valueOf(ran.nextInt());
     //读取当前session里面的hashCode集合,此处使用了Set,方便判断。
     Set<String> token= (Set<String>)  session.getAttribute("token");
     if (token== null) {
          token = new HashSet<String>();
     }
     // 检测重复问题
     while (token.contains(formhash)) {
          formhash = String.valueOf(ran.nextInt());
     }
     // 保存到session里面
     token.add(formhash);
     // 保存
     session.setAttribute("token", token);
     %>

2、
  from表单中加入隐藏域

<input type="hidden" name="formhash" id="formhash" value="<%=formhash%>" />

3、后台代码 判断是否重复提交

        Map<String,String> map = new HashMap<String,String>();
        // 拿到表单的formhash
        String formhash = request.getParameter("formhash");
        // 拿到session里面的集合
        Set<String> token= (Set<String>) request.getSession().getAttribute("token");
         // 如果没有,则是重复提交,或者非法提交
         if (token== null || !token.contains(formhash)) {
        	 map.put("flag", "false");
 			 map.put("message", "已经提交成功,请勿重复提交!");
 			return map;
          }

          // 最后,如果操作成功,从session里面把这个formhash 删掉!
          token.remove(formhash);
          request.getSession().setAttribute("token", token); 

如果重复提交了,直接return错误信息给页面即可。

第二种处理方法(拦截器):

如果用过Struts2的,可以参考Struts2的Token相关机制即可。下面的实现是SpringMVC/SPring/Mybatis项目中实现的方法。(代码稍后整理贴出)

Servlet、SPringMVC、Struts等防止表单重复提交的多种处理方法

时间: 2024-10-25 23:51:00

Servlet、SPringMVC、Struts等防止表单重复提交的多种处理方法的相关文章

Servlet、SPringMVC、Struts等防止表单反复提交的多种处理方法

第一种处理方法(非拦截器): 眼下这样的方法不建议,由于JSP规范不建议写JAVA代码.这样的能够方便另外一种处理方法的理解,另外一种方法引入拦截器的思想,原理基本一样,模仿Struts的Token机制. 1.在须要防止反复的jsp中添?以下的java代码, <%@page import="java.util.Random"%> <%@page import="java.util.Set"%> <%@page import="

[PHP]防止表单重复提交的几种方法

--------------------------------------------------------------------------------------------------- 1. 使用JS让按钮在点击一次后禁用(disable).=> 防止多次点击发生,实现方式较简单. 缺点:若客户端禁止JavaScript脚本,则失效. 2. 在提交成功后执行页面重定向(redirect).=> 转到提交成功信息页面. 特点:避免F5重复提交,消除浏览器前进和后退按导致的同样问题.

避免表单重复提交的几种方法

表单重复提交是Web 应用中最常见.带来很多麻烦的一个问题,用户有时候会重复的点击提交按钮,会导致多次提交,产生重复数据, 那么如何避免Form表单多次提交呢?下面介绍防止表单重复提交的几种方法 一.有很多的应用场景都会遇到重复提交问题,比如: 1.点击提交按钮两次.2.点击刷新按钮.3.使用浏览器后退按钮重复之前的操作,导致重复提交表单.4.使用浏览器历史记录重复提交表单.5.浏览器重复的 HTTP 请求. 二.防止表单重复提交的方法 1.禁掉提交按钮 表单提交后使用 Javascript 使

防止表单重复提交的几种方法

表单重复提交是在多用户Web应用中最常见.带来很多麻烦的一个问题.有很多的应用场景都会遇到重复提交问题,比如: 1.点击提交按钮两次. 2.点击刷新按钮. 3.使用浏览器后退按钮重复之前的操作,导致重复提交表单. 4.使用浏览器历史记录重复提交表单. 5.浏览器重复的HTTP请求. 防止表单重复提交的几种方法 1.禁掉提交按钮. 表单提交后使用Javascript使提交按钮disable.这种方法防止心急的用户多次点击按钮. 2.Post/Redirect/Get模式. 在提交后执行页面重定向,

如何使用Struts 2防止表单重复提交?

用户重复提交表单在某些场合将会造成非常严重的后果.例如,在使用信用卡进行在线支付的时候,如果服务器的响应速度太慢,用户有可能会多次点击提交按钮,而这可能导致那张信用卡上的金额被消费了多次.因此,重复提交表单会对你的系统带来逻辑影响,必须采取一些措施防止这类情况的发生. 用户重复提交同一个HTML表单的原因有:快速多次点击提交按钮:提交表单后按下浏览器的刷新按钮. 设置Struts 2的预防表单重复提交的功能 Struts 2已经内置了能够防止用户重复提交同一个HTML表单的功能.它的工作原理:让

使用Struts 2防止表单重复提交

用户重复提交表单在某些场合将会造成非常严重的后果.例如,在使用信用卡进行在线支付的时候,如果服务器的响应速度太慢,用户有可能会多次点击提交按钮,而这可能导致那张信用卡上的金额被消费了多次.因此,重复提交表单会对你的系统带来逻辑影响,必须采取一些措施防止这类情况的发生. 用户重复提交同一个HTML表单的原因有: 一.快速多次点击了提交按钮:二.提交表单后按下浏览器的刷新按钮. 设置Struts 2的预防表单重复提交的功能 Struts 2已经内置了能够防止用户重复提交同一个HTML表单的功能.它的

Struts中防止表单重复提交

Struts内部会经过很多interceptor,只需在struts.xml中配置如下代码就可以防止表单重复提交 <action name="login" class="com.lzw.action.UserAction"> <!-- 配置拦截器进行token拦截 --> <interceptor-ref name="defaultStack"/> <interceptor-ref name="

防止表单重复提交的三种方法

防止重复提交的办法 ----------------------------------------------------------------- jquery 的方法 $("#btn").one("click",function(){//只触发一次 YouMethod(); }); ------------------------------------------------------------------js的方法 var status=0;//开关

struts2防止表单重复提交的一种方法

在Struts2中的struts.xml中,result标签的type默认值是 dispatcher,(请求转发),要实现以上的功能,肯定不能使用默认值,我们需要将其值设为redirectAction(重定向到某一 Action),也就是说重一个Action跳转到另外一个Action,此时浏览器中的地址是第二个Action,结合到上面的需求,我们可以再第一个 Action中将记录添加到数据库中,然后在第二个Action中将数据读取出来.以后每次刷新,那么只会执行第二个Action.