1、配置拦截器

spring-mvc.xml

<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**/*"/>
<mvc:exclude-mapping path="/css/**"/>
<mvc:exclude-mapping path="/images/**"/>
<mvc:exclude-mapping path="/js/**"/>
<mvc:exclude-mapping path="/upload/**"/>
<bean class="com.tp.soft.common.interceptor.AvoidDuplicateSubmissionInterceptor" />
</mvc:interceptor>
</mvc:interceptors>

2、写注解接口

Token.java

package com.tp.soft.common.interceptor;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention (RetentionPolicy.RUNTIME)
public @interface Token {boolean save() default false ;boolean remove() default false ;
}

3、写拦截器

AvoidDuplicateSubmissionInterceptor.java

package com.tp.soft.common.interceptor;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.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;public class AvoidDuplicateSubmissionInterceptor extends HandlerInterceptorAdapter  {@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 needSaveSession = annotation.save();if (needSaveSession) {request.getSession( false ).setAttribute("token", UUID.randomUUID().toString());}boolean needRemoveSession = annotation.remove();if (needRemoveSession) {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" );if (serverToken == null ) {return true ;}String clinetToken = request.getParameter( "token" );if (clinetToken == null ) {return true ;}if (!serverToken.equals(clinetToken)) {return true ;}return false ;}}

4、在需要生成token的方法上写上@Token(save=true) 在重复请求的方法上写上@Token(remove=true)

5、在页面上如果是form表单写上

<input type="hidden" name="token" value="${token}" />

如果是异步的则直接用${token}传入参数

转载于:https://www.cnblogs.com/tplovejava/p/5473159.html

spring 注解重复(防重复请求)相关推荐

  1. 防止跨站请求伪造(CSRF)攻击 和 防重复提交 的方法的实现

    CSRF的概念可以参考:http://netsecurity.51cto.com/art/200812/102951.htm 本文介绍的是基于spring拦截器的Spring MVC实现 首先配置拦截 ...

  2. AOP+自定义注解token令牌和参数防重复提交实战

    目录 一.哪些因素会引起重复提交? 二.重复提交会带来哪些问题? 三.订单的防重复提交你能想到几种方案? 四.自定义注解方式 4.1Java核心知识-自定义注解(先了解下什么是自定义注解) 4.1.1 ...

  3. Spring MVC表单防重复提交

    转载自 Spring MVC表单防重复提交 利用Spring MVC的过滤器及token传递验证来实现表单防重复提交. 创建注解 @Target(ElementType.METHOD) @Retent ...

  4. Spring AOP + Redis解决重复提交的问题

    Spring AOP + Redis解决重复提交的问题 用户在点击操作的时候,可能会连续点击多次,虽然前端可以通过设置按钮的disable的属性来控制按钮不可连续点击,但是如果别人拿到请求进行模拟,依 ...

  5. springboot 主键重复导致数据重复_Springboot实现防重复提交和防重复点击(附源码)...

    背景# 同一条数据被用户点击了多次,导致数据冗余,需要防止弱网络等环境下的重复点击 目标# 通过在指定的接口处添加注解,实现根据指定的接口参数来防重复点击 说明# 这里的重复点击是指在指定的时间段内多 ...

  6. redis+aop防重复提交

    文章目录 1.防重复提交注解 2.redis分布式锁 3.防止重复提交Aop 之前有记录一篇用redis+拦截器防重复提交的内容: redis+拦截器防重复提交 1.防重复提交注解 @Target(E ...

  7. Java的token解决方案,SpringMVC后台token防重复提交解决方案

    思路1.添加拦截器,拦截需要防重复提交的请求 2.通过注解@Token来添加token/移除token    3.前端页面表单添加(如果是Ajax请求则需要在请求的json数据中添加token值) 核 ...

  8. springBoot防重复提交

    一.重复提交原因 由于客户端抖动,人为快速点击,造成服务器重复处理 二.后端防重复提交 1.基于token 访问请求到达服务器,服务器端生成token,分别保存在客户端和服务器.提交请求到达服务器,服 ...

  9. Java实现防重复提交

    欢迎访问我的个人博客:www.ifueen.com 防重复提交的重要性? 在业务开发中,为什么我们要去想办法解决重复提交这一问题发生?网上的概念很多:导致表单重复提交,造成数据重复,增加服务器负载,严 ...

最新文章

  1. Python设计模式-职责链模式
  2. uploadify 上传
  3. 倒计时2天!AI大咖云集、30场技术公开课,还有乐队... 年度最有意思的AI开发者活动来了!...
  4. 如何使用Linux的Crontab定时执行PHP脚本的方法
  5. 《塔木德智慧全书》(之四)
  6. BSD:Berkeley Software Distribution,伯克利软件套件
  7. Python函数默认值参数的2个坑
  8. 如何在Mac电脑上调整日期和时间?如何高效管理时间?
  9. 失败程序员的十年总结
  10. html 手机底部广告,手机网站被UC浏览器强制嵌入推荐广告解决方案
  11. 相机快门、 光圈有啥区别?
  12. android中数据统计,Android 友盟统计集成
  13. X280 工业4g路由器
  14. excel表格合并程序
  15. Day 41多表查询以及pymysql相关操作 完善
  16. 2019牛客暑期多校训练营(第二场)H Second Large Rectangle
  17. 为什么电子邮件发送失败?电子邮件发送失败的原因及解决方法
  18. python 课后习题:项目二数据分析之《冰与火之歌》全五卷人物关系图
  19. 储存程序通用计算机预设方案,【盛兴利合互动课堂功能―通用型备课及课堂授课应用】PjTime.COM 解决方案 盛兴利合...
  20. 炫云云模型收费模型免费下载

热门文章

  1. Python `__enter__` `__exit__`(with)
  2. C语言 gcc 静态库
  3. 编程语言对比 引用数据类型-字典
  4. Python 读写文本(open)
  5. class matplotlib.figure.Figure
  6. Pandas 文本数据方法 slice( )
  7. 在建工程直接费用化_临夏州开展建设工程安全专项整治
  8. java发送post请求json格式_Linux QT 4G发送HTTP POST请求发送JSON格式的数据
  9. Windows update一直停留在正在检查更新,为什么
  10. 华为云-云容器引擎 CCE新功能发布动态