利用Spring MVC的过滤器及token传递验证来实现表单防重复提交。

创建注解

  1. @Target(ElementType.METHOD)

  2. @Retention(RetentionPolicy.RUNTIME)

  3. @Documented

  4. public @interface Token {

  5.    boolean create() default false;

  6.    boolean remove() default false;

  7. }

在跳转页面的方法上加上:@Token(create = true)\ 在提交的action方法上加上:@Token(remove = true)

创建过滤器

  1. public class TokenInterceptor extends HandlerInterceptorAdapter {

  2.    private Logger logger = Logger.getLogger(TokenInterceptor.class);

  3.    private static final String TOKEN = "token";

  4.    @Override

  5.    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,

  6.            Object handler) throws Exception {

  7.        if (handler instanceof HandlerMethod) {

  8.            Method method = ((HandlerMethod) handler).getMethod();

  9.            Token annotation = method.getAnnotation(Token.class);

  10.            if (annotation != null) {

  11.                HttpSession session = request.getSession();

  12.                // 创建token

  13.                boolean create = annotation.create();

  14.                if (create) {

  15.                    session.setAttribute(TOKEN, UUID.randomUUID().toString());

  16.                    return true;

  17.                }

  18.                // 删除token

  19.                boolean remove = annotation.remove();

  20.                if (remove) {

  21.                    if (isRepeatSubmit(request)) {

  22.                        logger.warn("表单不能重复提交:" + request.getRequestURL());

  23.                        return false;

  24.                    }

  25.                    session.removeAttribute(TOKEN);

  26.                }

  27.            }

  28.        } else {

  29.            return super.preHandle(request, response, handler);

  30.        }

  31.        return true;

  32.    }

  33.    private boolean isRepeatSubmit(HttpServletRequest request) {

  34.        String token = (String) request.getSession().getAttribute(TOKEN);

  35.        if (token == null) {

  36.            return true;

  37.        }

  38.        String reqToken = request.getParameter(TOKEN);

  39.        if (reqToken == null) {

  40.            return true;

  41.        }

  42.        if (!token.equals(reqToken)) {

  43.            return true;

  44.        }

  45.        return false;

  46.    }

  47. }

配置拦截器

  1. <!--配置拦截器 -->  

  2. <mvc:interceptors>

  3.    <mvc:interceptor>  

  4.        <mvc:mapping path="/**" />

  5.        <bean class="com.example.web.interceptor.TokenInterceptor"/>    

  6.    </mvc:interceptor>

  7. </mvc:interceptors>

表单添加token

  1. <input type="hidden" id="token" name="token" value="$!{session.getAttribute('token')}"/>

Spring MVC表单防重复提交的更多相关文章

  1. 使用aop注解实现表单防重复提交功能

    原文:https://www.cnblogs.com/manliu/articles/5983888.html 1.这里采用的方法是:使用get请求进入表单页面时,后台会生成一个tokrn_flag分 ...

  2. spring MVC 后台token防重复提交解决方案

    看到公司有个部门提出了这个问题,补个粗略的解决方案... 1.编写拦截器 /** * Description: 防止重复提交 * * @Author liam * @Create Date: 2018 ...

  3. Spring MVC表单提交

    实际应用中,列表中的单条记录的修改,可能需要传很多对象参数到后台服务器,Spring MVC表单标签<form:> 提供了一种简洁的提交方式. <form id="form ...

  4. Spring MVC - 表单处理示例

    环境搭建 环境: Intellij IDEA Spring MVC 完整的项目文件结构如下所示: Student.java package com.ktao.controller; public cl ...

  5. Spring MVC表单处理

    以下示例演示如何编写一个简单的基于Web的应用程序,它使用Spring Web MVC框架使用HTML表单. 首先使用Eclipse IDE,并按照以下步骤使用Spring Web Framework ...

  6. 使用Spring MVC表单标(转)

    概述     在低版本的Spring中,你必须通过JSTL或<spring:bind>将表单对象绑定到HTML表单页面中,对于习惯了Struts表单标签的开发者来说,Spring MVC的 ...

  7. struts2 文件的上传下载 表单的重复提交 自定义拦截器

    文件上传中表单的准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设 ...

  8. php中如何防止表单的重复提交

    在php中如何防止表单的重复提交?其实也有几种解决方法. 下面小编就为大家介绍一下吧.需要的朋友可以过来参考下 代码: <?php /* * php中如何防止表单的重复提交 * by www.j ...

  9. php-- 避免表单的重复提交

    用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数据库中,这是一个比较棘手的问题.我们可以从客户端和服务器端一起着手,设法避免同一表单的重复提交. 1.使用客户端脚本 提 ...

随机推荐

  1. Java join & yield

    Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程. yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会.因此,使用yie ...

  2. modify headers插件的使用

    Modity headers是firefox浏览器的一个插件,作用是改变http请求的IP地址 (一)在firefox中添加该插件 步骤一:打开firefox浏览器,打开地址: https://add ...

  3. 学习laravel源码之中间件原理

    刨析laravel源码之中间件原理 在看了laravel关于中间件的源码和参考了相关的书籍之后,写了一个比较简陋的管道和闭包实现,代码比较简单,但是却不好理解所以还是需要多写多思考才能想明白其中的意义 ...

  4. php 的stdClass类的简单实用

    <?php $person = new stdClass(); $person->name = "yu"; $person->sex = "man&qu ...

  5. SpringBoot(七)_统一异常处理

    我感觉看了这节课,给我的思考还是很多的,感觉受益良多.废话不多说,一起学习. 统一的 外层结构返回 这样利于代码看着也规范,前端处理也统一 # 错误返回 { "code": 1, ...

  6. 静态属性加载到jvm时候就存放在数据共享区,而不是等new后出现

    静态属性加载到jvm时候就存放在数据共享区,而不是等new后出现.他的生命周期是 jvm结束 才会消失,一般的方法属性是对象结束后 就会消失.

  7. [洛谷P4819][中山市选]杀人游戏

    题目大意:有一张$n$个点$m$条边的有向图,有一个关键点,如果你访问一个点,你会知道它连出的边中有没有关键点,以及若有的话是哪个.问最优策略下不访问关键点而知道关键点的概率 题解:发现若一个点不是关 ...

  8. 每个 JavaScript 工程师都应懂的33个概念

    简介 这个项目是为了帮助开发者掌握 JavaScript 概念而创立的.它不是必备,但在未来学习(JavaScript)中,可以作为一篇指南. 本篇文章是参照 @leonardomso 创立,英文版项 ...

  9. 学习Spring Boot:(七)集成Mybatis

    前面都是用的是spring data JPA,现在学习下Mybatis,而且现在Mybatis也像JPA那样支持注解形式了,也非常方便,学习一下. 数据库 mysql 5.7 添加依赖 在pom文件中 ...

  10. 安装GourdScanV2的踩坑过程

    环境:ubuntu 16.04.1 1.安装dcoker sudo apt-get install docker.io 坑:sudo apt-get install docker 2.下载关于dock ...