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

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

注,如果是集群的方式,则需要将token放入到缓存中即可。 

注解Token代码:java源码  

Java代码 复制代码 收藏代码
1[email protected](ElementType.METHOD)
2[email protected] (RetentionPolicy.RUNTIME)
3.public @interface Token {
4.
5.     boolean needSaveToken () default false ;
6.
7.     boolean needRemoveToken () default false ;
8.}  

拦截器TokenInterceptor代码: 

Java代码 复制代码 收藏代码
1.public class TokenInterceptor extends HandlerInterceptorAdapter {
2.
3.     @Override
4.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throwsException {
5.         if (handler instanceof HandlerMethod) {
6.             HandlerMethod handlerMethod = (HandlerMethod) handler;
7.             Method method = handlerMethod.getMethod();
8.             Token annotation = method.getAnnotation(Token. class );
9.             if (annotation != null ) {
10.                 boolean needSaveSession = annotation.save();
11.                 if (needSaveSession) {
12.                     request.getSession( false ).setAttribute( "token" , UUID.randomUUID().toString());
13.                 }
14.                 boolean needRemoveSession = annotation.remove();
15.                 if (needRemoveSession) {
16.                     if (isRepeatSubmit(request)) {
17.                         return false ;
18.                     }
19.                     request.getSession( false ).removeAttribute( "token" );
20.                 }
21.             }
22.             return true ;
23.         } else {
24.             return super .preHandle(request, response, handler);
25.         }
26.     }
27.
28.     private boolean isRepeatSubmit(HttpServletRequest request) {
29.         String serverToken = (String) request.getSession( false ).getAttribute( "token" );
30.         if (serverToken == null ) {
31.             return true ;
32.         }
33.         String clinetToken = request.getParameter( "token" );
34.         if (clinetToken == null ) {
35.             return true ;
36.         }
37.         if (!serverToken.equals(clinetToken)) {
38.             return true ;
39.         }
40.         return false ;
41.     }
42.}  

然后在Spring MVC的配置文件里加入: 

Xml代码 复制代码 收藏代码
1.<!-- 拦截器配置 -->
2.< mvc:interceptors >
3.     <!-- 配置Shiro拦截器,实现注册用户的注入 -->
4.     < mvc:interceptor >
5.         < mvc:mapping path = "/**" />
6.         < bean class = "com.storezhang.video.shiro.ShiroInterceptor" />
7.     </ mvc:interceptor >
8.     <!-- 配置Token拦截器,防止用户重复提交数据 -->
9.     < mvc:interceptor >
10.         < mvc:mapping path = "/**" />
11.         < bean class = "com.storezhang.web.spring.TokenInterceptor" />
12.     </ mvc:interceptor >
13.</ mvc:interceptors >  

相关代码已经注释,相信你能看懂。
关于这个方法的用法是:在需要生成token的controller上增加@Token(save=true),而在需要检查重复提交的controller上添加@Token(remove=true)就可以了。
另外,你需要在view里在form里增加下面代码: 

Html代码 复制代码 收藏代码
1.<     input     type     =     "hidden"     name     =     "token"     value     =     "${token}"     />  

在相关方法中加入注解 

Java代码 复制代码 收藏代码
1[email protected]("/save")
2. @AvoidDuplicateSubmission(needRemoveToken = true)
3.    public synchronized ModelAndView save(ExecutionUnit unit, HttpServletRequest request, HttpServletResponse response)
4.            throws Exception {
5.
6[email protected]("/edit")
7.    @AvoidDuplicateSubmission(needSaveToken = true)
8.    public ModelAndView edit(Integer id, HttpServletRequest request) throws Exception {  

已经完成了,去试试看你的数据还能重复提交了吧。 
时间: 2024-10-12 02:26:56

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

Spring Boot 2.X(九):Spring MVC - 拦截器(Interceptor)

拦截器 1.简介 Spring MVC 中的拦截器(Interceptor)类似于 Servlet 开发中的过滤器 Filter,它主要用于拦截用户请求并作相应的处理,它也是 AOP 编程思想的体现,底层通过动态代理模式完成. 2.定义实现类 拦截器有两种实现方式: 1.实现 HandlerInterceptor 接口 2.继承 HandlerInterceptorAdapter 抽象类(看源码最底层也是通过 HandlerInterceptor 接口 实现) 3.HandlerIntercep

Spring MVC 中采用注解方式 Action中跳转到另一个Action的写法

Spring MVC 中采用注解方式 Action中跳转到另一个Action的写法 在Action中方法的返回值都是字符串行,一般情况是返回某个JSP,如: return "xx":意思是返回到某个JSP页面上 如果想在此Action中跳转到另一个Action中怎样做呢? return "redirect://.do?" 例如: @RequestMapping(params = "action=delete") public String del

对于Spring MVC 拦截器的一些了解

Spring MVC 拦截器的执行顺序 应用场景 假设请求 localhost:8080/ 则要求直接重定向到 localhost:8080/login ; 定义拦截器顺序 permission login 执行顺序 pre 先执行先定义的,而 post 和 after 先执行后定义的. 原文地址:https://www.cnblogs.com/bjio/p/12242920.html

7、struts2 案例( 模型驱动、 防止表单重复提交--拦截器 、数据回显 、值栈 、 OGNL表达式综合运用)

struts2 案例 技术点: 模型驱动 防止表单重复提交–拦截器 数据回显 值栈 OGNL表达式 通配符.路径匹配原则.常量 数据处理的集中方式 请求数据自动封装以及类型转换 1.导包 c3p0-0.9.1.2.jar commons-dbutils-1.6.jar commons-fileupload-1.2.2.jar commons-io-2.0.1.jar commons-lang3-3.1.jar freemarker-2.3.19.jar javassist-3.11.0.GA.j

struts2 自带的 token防止表单重复提交拦截器

在struts2中,我们可以利用struts2自带的token拦截器轻松实现防止表单重复提交功能! 1. 在相应的action配置中增加:  <interceptor-ref name="token"></interceptor-ref> <result name="invalid.token">/error.jsp</result> 2. 增加error.jsp文件,代码如下:  <h1>禁止重复提交&l

Struts2系列:(13)防表单重复提交(token + 拦截器)

1.原理 服务器端和客户端通过token(令牌)来进行验证: (1)Browser向Tomcat服务器请求填写表单 (2)Tomcat服务器将带有token的表单返回给Browser (3)浏览器端在提交时,将form和token一起发送到服务器 (4)Tomcat服务器对Browser进行验证 2.基本步骤 基本步骤如下: 第一步:写好Action,在struts.xml为接受该表单提交请求的action配置token拦截器[服务器] <action name="student_*&qu

Jfinal token拦截器另类实现,防止表单重复提交

大部分的操作和jfinal原来的是相似的 在跳转到view之前,生成token createToken("jockillerToken", 30*60); 2.在页面中加入隐藏域,内容如下 <input type="hidden" name="jockillerToken" value="${jockillerToken}"/> 3.定义token拦截器,这就是唯一的一点不同的地方 /**  * 防止表单重复提交

spring MVC拦截器01

spring MVC拦截 作用:身份校验,权限检查,防止非法訪问. 场景:一个bbs系统,用户没有登录就无法发帖或者删除评论; 一个博客系统,没有登录就无法发表博文,无法添加分类,无法删除博文. spring MVC 拦截实现分为2步 (1)编写拦截器类,必须继承org.springframework.web.servlet.HandlerInterceptor 核心方法: public boolean preHandle(HttpServletRequest request, HttpServ

自定义 spring mvc 拦截器(近期项目需求实现)

需求背景:特定文件夹下任何文件不经过登录,全部拦截强制跳转登录,并客户端禁止下载服务器定制文件夹文件 经过1天多时间的各种尝试,自定义式的强大拦截器实现了,废话不说了,直接贴代码啦. demo: 1>   根目录下 index.html 内容: <a href="html/index.html">index</a><br/> <a href="html/login3.html">login3.html---<