用session防止表单重复提交

思路:在服务器端生成一个唯一的随机标识串Token,同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识串。
服务器程序将拒绝处理用户提交的表单请求:
1,存储Session域中的Token与表单提交的Token不同。
2,当前用户的Session中不存在Token。
3,用户提交的表单数据中没有Token。

代码:

  1. /**
  2. * 防重复提交工具类
  3. */
  4. public class TokenUtil {
  5. private static String REPEAT_SUBMIT_TOKEN = "REPEAT_SUBMIT_TOKEN";
  6. private static TokenUtil instance = new TokenUtil();
  7.  
  8. private TokenUtil() {
  9.  
  10. }
  11.  
  12. public static TokenUtil getInstance() {
  13. return instance;
  14. }
  15.  
  16. public static boolean isTokenValid(HttpServletRequest request) {
  17. return instance.isTokenValid(request, true);
  18. }
  19.  
  20. public static boolean isTokenValid(HttpServletRequest request, boolean reset) {
  21. HttpSession session = request.getSession(false);
  22.  
  23. if (session == null) {
  24. return false;
  25. }
  26.  
  27. String saved = (String) session.getAttribute(REPEAT_SUBMIT_TOKEN);
  28.  
  29. if (saved == null) {
  30. return false;
  31. }
  32.  
  33. if (reset) {
  34. instance.resetToken(request);
  35. }
  36.  
  37. String token = request.getParameter(REPEAT_SUBMIT_TOKEN);
  38.  
  39. if (token == null) {
  40. return false;
  41. }
  42.  
  43. return saved.equals(token);
  44. }
  45.  
  46. public static void resetToken(HttpServletRequest request) {
  47. HttpSession session = request.getSession(false);
  48.  
  49. if (session == null) {
  50. return;
  51. }
  52.  
  53. session.removeAttribute(REPEAT_SUBMIT_TOKEN);
  54. }
  55.  
  56. public static void saveToken(HttpServletRequest request) {
  57. HttpSession session = request.getSession();
  58. String token = instance.generateToken(request);
  59.  
  60. if (token != null)
  61. session.setAttribute(REPEAT_SUBMIT_TOKEN, token);
  62. }
  63.  
  64. public static void saveToken(HttpServletRequest request, ResponseJSON responseJSON) {
  65. HttpSession session = request.getSession();
  66. String token = instance.generateToken(request);
  67.  
  68. if (token != null) {
  69. session.setAttribute(REPEAT_SUBMIT_TOKEN, token);
  70. }
  71. if (responseJSON != null) {
  72. responseJSON.setRepeatSubmitToken(token);
  73. }
  74.  
  75. }
  76.  
  77. private String generateToken(HttpServletRequest request) {
  78. HttpSession session = request.getSession();
  79.  
  80. return generateToken(session.getId());
  81. }
  82.  
  83. private String generateToken(String id) {
  84. try {
  85. long current = System.currentTimeMillis();
  86. current += new java.util.Random().nextInt(100);
  87.  
  88. byte[] now = new Long(current).toString().getBytes();
  89. MessageDigest md = MessageDigest.getInstance("MD5");
  90.  
  91. md.update(id.getBytes());
  92. md.update(now);
  93.  
  94. return toHex(md.digest());
  95. } catch (NoSuchAlgorithmException e) {
  96. }
  97. return null;
  98. }
  99.  
  100. private String toHex(byte[] buffer) {
  101. StringBuffer sb = new StringBuffer(buffer.length * 2);
  102.  
  103. for (int i = 0; i < buffer.length; i++) {
  104. sb.append(Character.forDigit((buffer[i] & 0xF0) >> 4, 16));
  105. sb.append(Character.forDigit(buffer[i] & 0xF, 16));
  106. }
  107.  
  108. return sb.toString();
  109. }
  110. }

java防止表单重复提交的更多相关文章

  1. java 防止表单重复提交(serlvet)

    java 防止表单重复提交 ---------FormServlet.java-------------- protected void doGet(HttpServletRequest reques ...

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

    转载大神 1. 使用session同步和token机制来防止并发重复提交 https://blog.csdn.net/hejingyuan6/article/details/50487777 2. S ...

  3. java web学习总结(十三) -------------------使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  4. [Java拾遗五]使用Session防止表单重复提交

    申明:此文章属于转载, 转自博客: http://www.cnblogs.com/xdp-gacl/p/3859416.html在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没 ...

  5. [原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. java web 学习十三(使用session防止表单重复提交)

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  7. java表单重复提交常用解决办法

    最近在看些基础的东西,顺便做下笔记.相信大家在平时网页使用中,经常会有按钮重复点击,然后点不动刷新,还有当网络延时比较厉害点了没反应在点击的重复提交.为了避免这种情况,总结了一下4点处理方案 表单重复 ...

  8. Java Web之表单重复提交问题

    上篇文章讲了验证码的制作,提及到了一个问题,就是表单重复提交的问题,可能在上次那个验证码中感觉不是那么的重要 现在我新写一个例子,转钱.通过这个例子你就知道表单重复提交有多恐怖了. 先来简单的介绍一下 ...

  9. java struts2入门学习--防止表单重复提交.OGNL语言学习

    一.知识点回顾 防止表单重复提交核心思想: 客户端和服务器端和写一个token,比较两个token的值相同,则非重复提交;不同,则是重复提交. 1.getSession三种方式比较: request. ...

随机推荐

  1. asp.net缓存

    copy:http://www.cnblogs.com/knowledgesea/archive/2012/06/20/2536603.html 一.缓存概念,缓存的好处.类型.            ...

  2. [java]设计模式1-单例模式

    单例模式:单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管 ...

  3. 1366分辨率其实是1368分辨率,firefox a标签点击有虚线

    1,通过intel 集成显卡的软件自定义一个1366分辨率,发现是1368的分辨率,@media screen and (max-deivce-width:1368px)才有效果,并且在同事电脑默认分 ...

  4. ConcurrentHashMap

    ConcurrentHashMap是Java5中新增加的一个线程安全的Map集合,可以用来替代HashTable.对于ConcurrentHashMap是如何提高其效率的,可能大多人只是知道它使用了多 ...

  5. redis慢查询日志

    运维需要记录一下主redis中那些“慢操作”的命令,然后找到相关的业务方,不然的话,阻塞 就不好玩了.然后就直接在redis手册中就找到了相关的命令. SLOWLOG subcommand [argu ...

  6. Linq 单表城市级联

    var list = (from province in db.Areas && province.IsDel == join city in db.Areas on province ...

  7. [翻译] V8引擎的解析

    原文:Parsing in V8 explained 本文档介绍了 V8 引擎是如何解析 JavaScript 源代码的,以及我们将改进它的计划. 动机 我们有个解析器和一个更快的预解析器(~2x), ...

  8. NPOI导出数据,设置格式,锁定单元格

    代码包括: 1:导出多个sheet    2:设置单元格格式   3:合并单元格   4:下拉框选项   5:输入数字限制   6:锁定单元格 static void Main(string[] ar ...

  9. new bird in github

    首次使用先要建立本地github信息: git config - -global user.name  newbird git config - -global user.email   newbir ...

  10. JavaScript------获取url地址中的参数

    $(document).ready(function () { //获取地址中的参数(name是字符串) function getParameter(name) { //正则表达式 var reg = ...