1. 原理:在去某个页面直接生成一个随机数(这里使用的是UUID)并放入session中,用户提交表单时将这个随机数传入服务端与session中的值进行比较,如果不不存在或不相等,则认为是重复提交;如果相等则不是重复提交。
  2. 实现技术:采用springmvc的拦截器统一处理
  3. 下面实现(五步)
  4. 第一步:
  5.  
  6. import java.lang.annotation.ElementType;
  7. import java.lang.annotation.Retention;
  8. import java.lang.annotation.RetentionPolicy;
  9. import java.lang.annotation.Target;
  10. /**
  11. * 防止重复提交用
  12. *
  13. *
  14. */
  15. @Target(ElementType.METHOD)//如果用在类上,将此行注释
  16. @Retention(RetentionPolicy.RUNTIME)
  17. public @interface Token {
  18. boolean save() default false;
  19. boolean remove() default false;
  20. }
  21. 第二步:拦截器
  22.  
  23. import java.lang.reflect.Method;
  24. import java.util.UUID;
  25. import javax.servlet.http.HttpServletRequest;
  26. import javax.servlet.http.HttpServletResponse;
  27. import org.springframework.web.method.HandlerMethod;
  28. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
  29. import com.xxx.annotation.anti_resubmit.Token;
  30. /**
  31. * 防止重复提交
  32. *
  33. *
  34. */
  35. public class TokenInterceptor extends HandlerInterceptorAdapter {
  36. private static final String TOKEN_NAME = "token";
  37. @Override
  38. public boolean preHandle(HttpServletRequest request,
  39. HttpServletResponse response, Object handler) throws Exception {
  40. if(handler instanceof HandlerMethod){
  41. HandlerMethod handlerMethod = (HandlerMethod) handler;
  42. Method method = handlerMethod.getMethod();
  43. Token annotation = method.getAnnotation(Token.class);
  44. if(annotation != null){
  45. boolean need2SaveSession = annotation.save();
  46. if(need2SaveSession){
  47. request.getSession(false).setAttribute("token", UUID.randomUUID().toString());
  48. }
  49. boolean need2RemoveSession = annotation.remove();
  50. if(need2RemoveSession){
  51. if(isRepeatSubmit(request)){
  52. return false;
  53. }
  54. request.getSession(false).removeAttribute("token");
  55. }
  56. }
  57. return true;
  58. }else{
  59. return super.preHandle(request, response, handler);
  60. }
  61. }
  62. /**检查是否是重复提交(为空,不相等)*/
  63. private boolean isRepeatSubmit(HttpServletRequest request) {
  64. String serverToken = (String) request.getSession(false).getAttribute(TOKEN_NAME);//服务端
  65. if(serverToken == null){
  66. return true;
  67. }
  68. String clientToken = request.getParameter(TOKEN_NAME);//客户端
  69. if(clientToken == null){
  70. return true;
  71. }
  72. if(!serverToken.equals(clientToken)){
  73. return true;
  74. }
  75. return false;
  76. }
  77. }
  78. 第三步:
  79. springmvc配置文件(拦截器)
  80. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
  81. <property name="interceptors">
  82. <list>
  83. <!-- <ref bean="wechatLoginInterceptor"/> -->
  84. <ref bean="tokenInteceptor"/>
  85. </list>
  86. </property>
  87. </bean>
  88. <bean id="tokenInteceptor" class="com.xxx.inteceptors.TokenInterceptor"/>
  89. 第四步:
  90. controller中使用
  91. @RequestMapping("/add.jspf")
  92. @Token(save=true)
  93. public String add() {
  94. //省略
  95. return TPL_BASE + "index";
  96. }
  97. @RequestMapping("/save.jspf")
  98. @Token(remove=true)
  99. public void save() {
  100. //省略
  101. }
  102. 第五步:
  103. 页面
  104. <input type="text" name="token" value="${token}"/>

  

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

  1. 拦截器springmvc防止表单重复提交【1】

    [参考博客:http://www.cnblogs.com/hdwpdx/archive/2016/03/29/5333943.html] springmvc 用拦截器+token防止重复提交 首先,防 ...

  2. SpringMVC防止表单重复提交

    最近公司上线,有同志进行攻击,表当防重复提交也没有弄,交给我 ,本人以前也没弄过,知道大概的思路,但是那样实在是太麻烦了,虽然后面试过使用过滤器加拦截器实现,不过还是有点小麻烦. 后来在网上搜索后发现 ...

  3. 拦截器springmvc防止表单重复提交【3】3秒后自动跳回首页【重点明白如何跳转到各自需要的页面没有实现 但是有思路】

    [1]定义异常类 [重点]:异常类有个多参数的构造函数public CmsException(String s, String... args),可以用来接受多个参数:如(“异常信息”,“几秒跳转”, ...

  4. 拦截器springmvc防止表单重复提交【3】自己实际项目

    1:[定义注解] package com.jspxcms.ext.interceptor; import java.lang.annotation.ElementType; import java.l ...

  5. 拦截器springmvc防止表单重复提交【2】

    [参考博客:http://my.oschina.net/mushui/blog/143397] 原理:在新建页面中Session保存token随机码,当保存时验证,通过后删除,当再次点击保存时由于服务 ...

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

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

  7. 大型运输行业实战_day05_1_登录+注销+表单重复提交+登录拦截器

    1.登录 登录实现如下步骤: 1.在首页中添加登录按钮 html代码如下: <%@ page contentType="text/html;charset=UTF-8" la ...

  8. Strusts2笔记9--防止表单重复提交和注解开发

    防止表单重复提交: 用户可能由于各种原因,对表单进行重复提交.Struts2中使用令牌机制防止表单自动提交.以下引用自北京动力节点:

  9. Spring Boot (一) 校验表单重复提交

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

随机推荐

  1. xml、json的序列化与反序列化

    xml数据 : XmlSerializer.Serialize   与  XmlSerializer.Deserialize,使用起来稍有些复杂,需要对 “实体模型” 的“对应属性”  进行  节点特 ...

  2. Codeforces Round #451 (Div. 2)

    水题场.... 结果因为D题看错题意,B题手贱写残了...现场只出了A,C,E A:水题.. #include<bits/stdc++.h> #define fi first #defin ...

  3. Codeforces Round #448 (Div. 2)C. Square Subsets

    可以用状压dp,也可以用线型基,但是状压dp没看台懂... 线型基的重要性质 性质一:最高位1的位置互不相同 性质二:任意一个可以用这些向量组合出的向量x,组合方式唯一 性质三:线性基的任意一个子集异 ...

  4. [转载]java合并word文件

    需求背景 在互联网教育行业,做内容相关的项目经常碰到的一个问题就是如何动态生成一张word试卷.事先把题库中的每一道试题都已经保存成一个独立的word文件了,但是在选择了部分试题生成一张word试卷的 ...

  5. SQLSERVER store procedure 临时表

    有些时候显示重复数据时,使用: ) 但有些时候表A过大或者逻辑复杂.显示数据时,会造成性能的影响,这时你就可以使用临时表:   ) create table #temp( XXX , XXX) )in ...

  6. Qt 中使用智能指针

    教研室的项目,就是用Qt做个图形界面能收发数据就可以了,但是创建数据管理类的时候需要各种new, delete,很小心了但是内存使用量在不断开关程序之后函数会长,由于用的是gcc 4.7.*  所以好 ...

  7. 条款23:宁以non-member, non-friend,替换member函数。

    考虑下面这种经常出现的使用方式: class webBroswer{ public: ... void clearCache(); void clearHistory(); void removeCo ...

  8. python 魔法方法补充(__setattr__,__getattr__,__getattribute__)

    python 魔法方法补充 1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发 class F(object): def _ ...

  9. Ubuntu下搭建WordPress环境

    WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用.WordPr ...

  10. jQuery 绑定事件总结

    目前已知有: $("..").bind("事件名",fn); $("parent").on("事件名","se ...