原理:在去某个页面直接生成一个随机数(这里使用的是UUID)并放入session中,用户提交表单时将这个随机数传入服务端与session中的值进行比较,如果不不存在或不相等,则认为是重复提交;如果相等则不是重复提交。实现技术:采用springmvc的拦截器统一处理下面实现(五步)第一步:package com.xxx.utils.anti_resubmit;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/*** 防止重复提交用* @author wsc* 2016年12月5日*/@Target(ElementType.METHOD)//如果用在类上,将此行注释@Retention(RetentionPolicy.RUNTIME)public @interface Token {boolean save() default false;  boolean remove() default false;}第二步:拦截器package com.xxx.inteceptors;import java.lang.reflect.Method;import java.util.UUID;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import com.xxx.annotation.anti_resubmit.Token;/*** 防止重复提交* @author wsc* 2016年12月5日*/public class TokenInterceptor extends HandlerInterceptorAdapter {private static final String TOKEN_NAME = "token";@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {if(handler instanceof HandlerMethod){HandlerMethod handlerMethod = (HandlerMethod) handler;Method method = handlerMethod.getMethod();Token annotation = method.getAnnotation(Token.class);if(annotation != null){boolean need2SaveSession = annotation.save();if(need2SaveSession){request.getSession(false).setAttribute("token", UUID.randomUUID().toString());}boolean need2RemoveSession = annotation.remove();if(need2RemoveSession){if(isRepeatSubmit(request)){return false;}request.getSession(false).removeAttribute("token");}}return true;}else{return super.preHandle(request, response, handler);}}/**检查是否是重复提交(为空,不相等)*/private boolean isRepeatSubmit(HttpServletRequest request) {String serverToken = (String) request.getSession(false).getAttribute(TOKEN_NAME);//服务端if(serverToken == null){return true;}String clientToken = request.getParameter(TOKEN_NAME);//客户端if(clientToken == null){return true;}if(!serverToken.equals(clientToken)){return true;}return false;}}第三步:springmvc配置文件(拦截器)<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"><property name="interceptors"><list><!-- <ref bean="wechatLoginInterceptor"/> --><ref bean="tokenInteceptor"/></list></property></bean><bean id="tokenInteceptor" class="com.xxx.inteceptors.TokenInterceptor"/>第四步:controller中使用@RequestMapping("/add.jspf")@Token(save=true)public String add() {//省略return TPL_BASE + "index";}@RequestMapping("/save.jspf")@Token(remove=true)public void save() {//省略}第五步:页面<input type="text" name="token" value="${token}"/>

  

转载于:https://www.cnblogs.com/zrbfree/p/6141212.html

161116、springmvc自己实现防止表单重复提交(基于注解)相关推荐

  1. SpringMVC中实现的token,防表单重复提交

    一:首先创建一个token处理类  ,这里的类名叫 TokenHandler private static Logger logger = Logger.getLogger(TokenHandler. ...

  2. 开发期间模板引擎页面修改以后,要实时生效 || 登陆成功,防止表单重复提交,可以重定向||只有登录之后才能访问相关的页面

    去除模板引擎的缓存 th:if  优先级高于  th:text 登陆成功,防止表单重复提交,可以重定向到主页 只有登录之后才能访问相关的页面 login.html <!DOCTYPE html& ...

  3. JAVA_OA(十四)番外:JAVAWEB防止表单重复提交的方法整合(包括集群部署)

    因为自己要用,所以查找了网络上javaweb项目防止表单重复提交的方法,有些部分不太好找,所以整合后贴出来,首先是孤傲苍狼的一部分博客文章,集群部署的解决方案在后面(注意大红字) 原文出处:孤傲苍狼的 ...

  4. 防止表单重复提交的问题

    最近老大让我处理一下订单重复提交的问题,不会做,自己网上默默的查资料,发现各式各样的,然后自己整理成一下,方便以后用. 首先我们分析下原因: 1.在网络延迟的情况下让用户有时间点击多次提交按钮导致表单 ...

  5. spring boot 学习(七)小工具篇:表单重复提交

    注解 + 拦截器:解决表单重复提交 前言 学习 Spring Boot 中,我想将我在项目中添加几个我在 SpringMVC 框架中常用的工具类(主要都是涉及到 Spring AOP 部分知识).比如 ...

  6. 七、SpringBoot——用户登录Demo(国际化、表单重复提交,登录拦截器)

    一.CURD的Demo 1开发前准备工作 新建一个SpringBoot工程 引入starter-web maven依赖 引入html页面和assert文件夹里的样式文件等等 2 实现访问登录页面 方式 ...

  7. springboot 订单重复提交_Spring Boot (一) 校验表单重复提交

    一.前言 在某些情况下,由于网速慢,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现表单数据重复提交造成数据库保存多条重复数据. 存在如上问题可以交给前端解决,判断多长时间内不能再次点 ...

  8. 简单介绍redis分布式锁解决表单重复提交的问题

    在系统中,有些接口如果重复提交,可能会造成脏数据或者其他的严重的问题,所以我们一般会对与数据库有交互的接口进行重复处理.本文就详细的介绍一下redis分布式锁解决表单重复提交,感兴趣的可以了解一下 假 ...

  9. python表单防重复提交_防止表单重复提交的几种策略

    表单重复提交是在多用户Web应用中最常见.带来很多麻烦的一个问题.有很多的应用场景都会遇到重复提交问题,比如: 点击提交按钮两次. 点击刷新按钮. 使用浏览器后退按钮重复之前的操作,导致重复提交表单. ...

最新文章

  1. 德州仪器Q2净利7.79亿美元 营收32.7亿美元
  2. 关于自注意力机制的思考
  3. 下载perl的mysql模块_安装用于操作MySQL的Perl模块
  4. SAP EWM 与 AGV 机器人对接的三种模式
  5. python网络爬虫基础知识_Python网络爬虫基础知识
  6. oracle的parse是什么意思,Oracle性能测量体系(Parse Time)
  7. 45 MM配置-采购-条件-定价过程-定义定价计算方案
  8. Odoo10参考系列--工作流
  9. 排序算法之 Inplace Merge Sort
  10. linux虚拟机cpu一分钟内负载,虚拟机性能调优-CPU篇
  11. ip,netstat命令案例
  12. ENVI/IDL编程:相对辐射校正-直方图匹配
  13. wap jsp 开发
  14. Linux AHCI驱动分析之设备初始化
  15. 肖文吉mysql_疯狂软件教育中心肖文吉老师_MYSQL视频教程
  16. 裁剪好的视频如何去除黑边?
  17. Java job interview:Linux操作系统的应用(红帽子)分析经验
  18. 医院影像服务器系统,锐潮医学影像管理系统(PACS)
  19. 电脑网页压力测试软件,网站压力测试工具
  20. 千牛插件开发,千牛SDK开发。

热门文章

  1. 3-6月计算机类学术会议合集
  2. numpy中的arange函数
  3. 智能座舱软件平台EX5.0发布,量“声”打造音视觉融合交互体验
  4. Maltego注册问题
  5. 穿透代理获取用户真实IP地址
  6. JAVAEE 实训日志01_20200704 上
  7. 先进先出物料架_仓库物料的先进先出FIFO管理(如何做到先进先出)
  8. armbian打印服务器恩山无线,刷了armbian后用cups共享打印非常爽
  9. 在tina或者其他系统里调用buildroot的库文件
  10. 什么是内存屏障?,为什么需要内存屏障?