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

后来在网上搜索后发现不错的方案如下:注解加拦截器完成

首先创建注解token:

@Target(ElementType.METHOD)//设置注解的可用范围-这里是方法上
@Retention(RetentionPolicy.RUNTIME)//设置注解的作用范围
public @interface Token { boolean save() default false; boolean remove() default false;
}

创建token拦截器:

 public class TokenInterceptor extends HandlerInterceptorAdapter {

   @Override
  public 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;
  }
}

然后在配置文件中配置好拦截器:注意这种方式在配置注解的处理器的时候需要配置:请求映射的方法处理器以及请求映射处理的适配器,如果使用

 <bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />这个默认的会找不到方法处理器    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
  <property name="interceptors">
    <list>
      <bean class="com.rbao.east.interceptor.TokenInterceptor"/>
    </list>
  </property>
</bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

然后在需要生成token的方法上面添加@Token(save = true)

需要进行校验的方法上添加@Token(remove = true)

最后在显示页面上添加隐藏字段:

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

本文来自:

http://blog.icoolxue.com/submitted-by-spring-mvc-to-prevent-data-duplication/

以及

http://chenzhou123520.iteye.com/blog/1702563

结合

Spring太'激情'了.有好的文章希望能推荐推荐

如果有什么好的方案,希望各位朋友推荐推荐相互学习,多谢~~~

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

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

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

  2. springmvc防止表单重复提交demo

    原理:在去某个页面直接生成一个随机数(这里使用的是UUID)并放入session中,用户提交表单时将这个随机数传入服务端与session中的值进行比较,如果不不存在或不相等,则认为是重复提交:如果相等 ...

  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. 12、Struts2表单重复提交

    什么是表单重复提交 表单的重复提交: 若刷新表单页面, 再提交表单不算重复提交. 在不刷新表单页面的前提下: 多次点击提交按钮 已经提交成功, 按 "回退" 之后, 再点击 &qu ...

  9. java防止表单重复提交

    用session防止表单重复提交 思路:在服务器端生成一个唯一的随机标识串Token,同时在当前用户的Session域中保存这个Token.然后将Token发送到客户端的Form表单中,在Form表单 ...

随机推荐

  1. 第 8 章 容器网络 - 061 - flannel 的连通与隔离

    flannel 的连通与隔离 测试 bbox1 和 bbxo2 的连通性: bbox1 能够 ping 到位于不同 subnet 的 bbox2,通过 traceroute 分析一下 bbox1 到 ...

  2. 日常英语---十二、MapleStory/Monsters/Level 1-10(Horny Mushroom)

    日常英语---十二.MapleStory/Monsters/Level 1-10(Horny Mushroom) 一.总结 一句话总结: horny-['hɔːnɪ]-adj.角的 Another m ...

  3. java ----> java.lang.NoClassDefFoundError

    环境: centos 6.10,vim,jdk1.8_u72,zookeeper-3.4.6,maven3+ 正文: 使用zk的api操作创建节点发生java.lang.NoClassDefFound ...

  4. mybatis ----> 各种方式使用MBG

    1.maven方式使用 配置好.pom文件 ①src/main/resources下创建 generatorConfig.xml,并配置好(自动生成的配置文件骨架) ②src/main/java 下创 ...

  5. English trip V1 - B 5.Is It Cold Outside? 外面很冷? Teacher:Corrine Key: weather

    In this lesson you will learn to talk about the weather. 本节课将学习到关于天气 课上内容(Lesson) 词汇(Key Word ) # 关于 ...

  6. 20180821ImportContactFromExcel

    Excel创建vcf文件,借助百度云助手导入Iphone6Plus Sub CreateContractList() Set Wb = Application.ThisWorkbook FilePat ...

  7. Tanya and Password CodeForces - 508D (欧拉回路)

    大意:给定n个长为3的子串, 求一个长为n+2的字符串包含所有子串. 相邻两个字符开一个节点, 建图跑欧拉回路, 若存在的话长度一定是$\le n+2$.

  8. 区间逼近 牛客寒假1 小a的排列

    做法:模拟 萌区间也就是这个区间里的数是一段连续的数 做法的话是先找出题目x,y的位置,记为l,r,然后找出l,r内的最大最小值,又因为萌区间要求数是连续的,就从这段连续数最小的开始到最大的,确定缩放 ...

  9. Java对MongoDB中的数据查询处理

    Java语言标准的数据库时MySQL,但是有些时候也会用到MongoDB,这次Boss交代处理MongoDB,所以讲代码以及思路记录下了 摸索的过程,才发现软件的适用还是很重要的啊!!! 我连接的Mo ...

  10. 让你明白kvm是什么

    参考:https://blog.csdn.net/bbwangj/article/details/80465320 KVM 工具集合: libvirt:操作和管理KVM虚机的虚拟化 API,使用 C ...