用session防止表单重复提交

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

代码:

 /**
* 防重复提交工具类
*/
public class TokenUtil {
private static String REPEAT_SUBMIT_TOKEN = "REPEAT_SUBMIT_TOKEN";
private static TokenUtil instance = new TokenUtil(); private TokenUtil() { } public static TokenUtil getInstance() {
return instance;
} public static boolean isTokenValid(HttpServletRequest request) {
return instance.isTokenValid(request, true);
} public static boolean isTokenValid(HttpServletRequest request, boolean reset) {
HttpSession session = request.getSession(false); if (session == null) {
return false;
} String saved = (String) session.getAttribute(REPEAT_SUBMIT_TOKEN); if (saved == null) {
return false;
} if (reset) {
instance.resetToken(request);
} String token = request.getParameter(REPEAT_SUBMIT_TOKEN); if (token == null) {
return false;
} return saved.equals(token);
} public static void resetToken(HttpServletRequest request) {
HttpSession session = request.getSession(false); if (session == null) {
return;
} session.removeAttribute(REPEAT_SUBMIT_TOKEN);
} public static void saveToken(HttpServletRequest request) {
HttpSession session = request.getSession();
String token = instance.generateToken(request); if (token != null)
session.setAttribute(REPEAT_SUBMIT_TOKEN, token);
} public static void saveToken(HttpServletRequest request, ResponseJSON responseJSON) {
HttpSession session = request.getSession();
String token = instance.generateToken(request); if (token != null) {
session.setAttribute(REPEAT_SUBMIT_TOKEN, token);
}
if (responseJSON != null) {
responseJSON.setRepeatSubmitToken(token);
} } private String generateToken(HttpServletRequest request) {
HttpSession session = request.getSession(); return generateToken(session.getId());
} private String generateToken(String id) {
try {
long current = System.currentTimeMillis();
current += new java.util.Random().nextInt(100); byte[] now = new Long(current).toString().getBytes();
MessageDigest md = MessageDigest.getInstance("MD5"); md.update(id.getBytes());
md.update(now); return toHex(md.digest());
} catch (NoSuchAlgorithmException e) {
}
return null;
} private String toHex(byte[] buffer) {
StringBuffer sb = new StringBuffer(buffer.length * 2); for (int i = 0; i < buffer.length; i++) {
sb.append(Character.forDigit((buffer[i] & 0xF0) >> 4, 16));
sb.append(Character.forDigit(buffer[i] & 0xF, 16));
} return sb.toString();
}
}

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. WebStorm

    1,简介 WebStorm 10是一款强大的HTML5编辑工具,是 JetBrains 推出的一款商业的 JavaScript 开发工具.功能强大的前端专用IDE,拥有即时编辑(chrome).自动完 ...

  2. [LeetCode] Delete Node in a BST 删除二叉搜索树中的节点

    Given a root node reference of a BST and a key, delete the node with the given key in the BST. Retur ...

  3. Redis集群~windows下搭建Sentinel环境及它对主从模式的实际意义

    回到目录 关于redis-sentinel出现的原因 Redis集群的主从模式有个最大的弊端,就是当主master挂了之前,它的slave从服务器无法提升为主,而在redis-sentinel出现之后 ...

  4. JAVA的正则表达式-学习

    1.正则表达式作用 正则表达式,是用来匹配字符串的,即检查一定的格式,还能按格式进行分组,替换......其实,不用正则表达式,也可以编.但是,大多数情况下,正则表达式可以提高你编程的效率. 2.学习 ...

  5. phpmyadmin not found

    在 ubuntu 14.04 中使用: > sudo apt-get install phpmyadmin 安装好 phpmyadmin 之后,打开 http://localhost/phpmy ...

  6. APP逆向常识

    SO库Linux系统下的动态库文件,就像win系统下的dll文件一样.将APK,改成RAR,在Lib目录下.dex(classes.dex)Dex是Android系统中可以在Dalvik虚拟机上直接运 ...

  7. django自带加密模块的使用

    首先,引入模块:  代码如下 复制代码 >>> from django.contrib.auth.hashers import make_password, check_passwo ...

  8. 图解TCP-IP协议

    本文通过图来梳理TCP-IP协议相关知识.TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道.如图1所示,给出了TCP通信过程的示意图. 图1 TCP 三次握手四次挥手 图1 ...

  9. Django自定义模板

    定义simple_tag步骤 一.创建templatetags文件 首先在app下创建templatetags文件:名字不许叫这个,不能改变. 二.在文件中创建一个py文件 文件名自定义 三.在创建的 ...

  10. Python为8bit深度图像应用color map

    图片中存在着色版的概念,二维矩阵的每个元素的值指定了一种颜色,因此可以显示出彩色. 迁移调色板 下述python代码将VOC数据集中的某个语义分割的图片的调色板直接应用在一个二维矩阵代表的图像上 #l ...