zoukankan      html  css  js  c++  java
  • 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项目中实现的方法。(代码稍后整理贴出)

     

  • 相关阅读:
    Spring学习之旅(二)--容器
    Spring学习之旅(一)--初始Spring
    Logback的使用
    DES加解密工具类
    Lombok插件的使用
    from 表单用 GET 方法进行 URL 传值时后台无法获取问题
    组播
    linux头文件路径
    IANA
    6号板获取或放文件
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3904799.html
Copyright © 2011-2022 走看看