原理:在新建页面中Session保存token随机码,当保存时验证,通过后删除,当再次点击保存时由于服务器端的Session中已经不存在了,所有无法验证通过。

1.新建注解:

/*** <p>* 防止重复提交注解,用于方法上<br/>* 在新建页面方法上,设置needSaveToken()为true,此时拦截器会在Session中保存一个token,* 同时需要在新建的页面中添加* <input type="hidden" name="token" value="${token}">* <br/>* 保存方法需要验证重复提交的,设置needRemoveToken为true* 此时会在拦截器中验证是否重复提交* </p>* @author: chuanli* @date: 2013-6-27上午11:14:02**/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AvoidDuplicateSubmission {boolean needSaveToken() default false;boolean needRemoveToken() default false;
}

2. 新建拦截器

/*** <p>* 防止重复提交过滤器* </p>** @author: chuanli* @date: 2013-6-27上午11:19:05*/
public class AvoidDuplicateSubmissionInterceptor extends HandlerInterceptorAdapter {private static final Logger LOG = Logger.getLogger(AvoidDuplicateSubmissionInterceptor.class);@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {User user = UserUtil.getUser();if (user != null) {HandlerMethod handlerMethod = (HandlerMethod) handler;Method method = handlerMethod.getMethod();AvoidDuplicateSubmission annotation = method.getAnnotation(AvoidDuplicateSubmission.class);if (annotation != null) {boolean needSaveSession = annotation.needSaveToken();if (needSaveSession) {request.getSession(false).setAttribute("token", TokenProcessor.getInstance().generateToken());}boolean needRemoveSession = annotation.needRemoveToken();if (needRemoveSession) {if (isRepeatSubmit(request)) {LOG.warn("please don't repeat submit,[user:" + user.getUsername() + ",url:"+ request.getServletPath() + "]");return false;}request.getSession(false).removeAttribute("token");}}}return true;}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;}}

3. 在Spring中配置

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"><property name="interceptors"><list><bean class="com.sohu.tv.crm.aop.UserLogInterceptor"/><bean class="com.sohu.tv.crm.aop.AvoidDuplicateSubmissionInterceptor"/></list></property></bean>

4. 在相关方法中加入注解:

@RequestMapping("/save")@AvoidDuplicateSubmission(needRemoveToken = true)public synchronized ModelAndView save(ExecutionUnit unit, HttpServletRequest request, HttpServletResponse response)throws Exception {@RequestMapping("/edit")@AvoidDuplicateSubmission(needSaveToken = true)public ModelAndView edit(Integer id, HttpServletRequest request) throws Exception {
5.在新建页面中加入
<input type="hidden" name="token" value="${token}">
from: https://my.oschina.net/mushui/blog/143397

Spring MVC拦截器+注解方式实现防止表单重复提交相关推荐

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

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

  2. 大聪明教你学Java | Spring Boot 使用自定义注解实现防止表单重复提交

    前言 表单重复提交是在多用户的 Web 应用中最常见且带来麻烦最多的一个问题.有很多的应用场景都会遇到表单重复提交问题,比如由于用户误操作,多次点击表单提交按钮:由于网速等原因造成页面卡顿,用户重复刷 ...

  3. Spring MVC拦截器~~~登陆验证拦截

    [ 30 分 钟 轻 松 入 门 Spring MVC][web 三 大 组 件 之 ~ ~ Filter 过 滤 器] Interceptor 拦截器学习: 1.了解spring mvc拦截器的概念 ...

  4. 使用session监听+spring MVC拦截器禁止用户重复登录

    在许多web项目中,需要禁止用户重复登录.一般来说有两种做法: 一是在用户表中维护一个字段isOnLine(是否在线),用户登录时,设定值为true,用户退出时设定为false,在重复登录时,检索到该 ...

  5. spring mvc拦截器_Spring MVC拦截器示例

    spring mvc拦截器 我认为现在是时候看看Spring的MVC拦截器机制了,这种机制已经存在了很多年,并且是一个非常有用的工具. Spring Interceptor会按照提示说:在传入的HTT ...

  6. 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor

    [Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...

  7. Java Spring MVC框架 VIII 之 Spring MVC拦截器

    Java Spring MVC框架 VIII 之 Spring MVC拦截器 Spring MVC拦截器 1.拦截器简介 拦截器是SpringMvc框架提供的功能 它可以在控制器方法运行之前或运行之后 ...

  8. spring mvc 拦截器拦截jsp页面

    spring mvc 拦截器怎么拦截jsp页面 你这个 是拦截带 /jsp 的 .do请求 解决方案 用spring 的拦截器 去拦截 所有的 .do 请求, 然后写一个 过滤器去拦截 所有的.jsp ...

  9. Spring Boot中防表单重复提交以及拦截器登录检测

    目录 理论 演示 源码 理论 在用户登录后,如果按F5刷新会出现表单重复提交的问题,解决这个问题后,如果没有拦截器登录检测,就会造成,任意用户可以登录后台界面,所以要有拦截器登录检测. 相关的逻辑步骤 ...

最新文章

  1. python 3.7.732位安装步骤_python安装教程(Windows系统,python3.7为例)
  2. 阿里云直播PHP SDK如何使用
  3. Struts2 ognl表达式
  4. .NET 文档数据库 RavenDB 4.0 发布
  5. Mathematics(jzoj 1747)
  6. cacti 忘记密码的方法
  7. 【如意影视】运营级+完整类库+解析线路+无限增加或删减解析接口+如意可视化播放器1.1
  8. 在中国从事什么职业最赚钱_中国最好的十大职业2(转)
  9. 发动机冒黑烟_发动机冒黑烟的原因和解决方法
  10. 第二章注解深入浅出(三、插桩)
  11. XAMP安装Apacher无法启动
  12. 2.GSAP(TweenMax手册/TweenLite手册)之一
  13. bc伐木机器人_1+X | 工业机器人操作编程平台(HB-CZBC-C10)
  14. 股权模板:72套股权分配方案
  15. 散列表,(拉链法,平方探测法,线性探测法)
  16. ecs共享型s6怎么样?
  17. 基于javaweb的宠物店管理系统(java+jsp+javascript+bootstrap+mysql)
  18. 人在做,天在看:天道有轮回,苍天饶过谁
  19. 基于JavaWeb的新闻发布管理系统设计与实现
  20. 看电视剧《天道》一点感想 + 法兰克福美景Opencv聚类分析

热门文章

  1. LESSON 11.4 原理进阶:AdaBoost算法流程详解
  2. 孙正义看未来30年:投资趋势,永远不会错
  3. ubuntu jdk
  4. redis 实际应用中的缓存作用
  5. 国家新一代人工智能开放创新平台将参加重庆智博会
  6. Caffe部署中的几个train-test-solver-prototxt-deploy等说明二
  7. 贾跃亭画了一个8500亿的大饼
  8. Spring Cloud Alibaba - 19 Nacos Config配置中心加载不同微服务的通用配置的两种方式
  9. Shell-alias在Shell脚本中的使用
  10. 学习笔记Kafka(二)—— Kafka安装配置(1)—— JDKZookeeper安装、Zookeeper 常用操作