利用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. T4模板_T4基本结构

    T4文本模板由 指令块.文本块.控制块 组成. 一. 指令块(MSDN文本模板指令) 指令块以@开头,基本的指令块包括<#@ template #> .<#@ parameter# ...

  2. OpenGL三维与光照

    #include<windows.h> #include<gl/glut.h> #include<gl/gl.h> #include<gl/glu.h> ...

  3. HDU 2140 Michael Scofield's letter

    http://acm.hdu.edu.cn/showproblem.php?pid=2140 Problem Description I believe many people are the fan ...

  4. Robot Framework 教程 (2) - 页面元素定位

    上一篇文章中,简单模拟了一个baidu搜索并截图的过程,在搜索过程中,我们需要对搜索框.搜索按钮进行定位.本篇文章主要介绍一下具体的定位方法. 我们的脚本如下: *** Settings *** Li ...

  5. Teamcity部署.net服务“无法连接到远程服务器”解决方式

    在公司Teamcity上执行自动部署.net服务的时候,发现Teamcity在启动default.aspx的时候报错了,提示:使用“0”个参数调用“GetResponse”时发生异常:“无法连接到远程 ...

  6. 关于js基本类型与引用类型(堆内存、栈内存的理解)

    js 基本类型与引用类型的区别 ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型,拥有方法的类型和不能拥有方法的类型,还可以分为可变类型和不可 ...

  7. 正则化项L1和L2

    本文从以下六个方面,详细阐述正则化L1和L2: 一. 正则化概述 二. 稀疏模型与特征选择 三. 正则化直观理解 四. 正则化参数选择 五. L1和L2正则化区别 六. 正则化问题讨论 一. 正则化概 ...

  8. BZOJ3504 CQOI2014危桥(最大流)

    如果只有一个人的话很容易想到最大流,正常桥连限流inf双向边,危桥连限流2双向边即可.现在有两个人,容易想到给两起点建超源两汇点建超汇,但这样没法保证两个人各自到达自己要去的目的地.于是再超源连一个人 ...

  9. noi.acNOIP模拟赛5-count

    题目链接 戳我 题意简述 你有一个n+1个数的序列,都是1~n,其中只有一个有重复,求每个长度的本质不同的子序列个数.\(mod 1e9+7\). sol 说起来也很简单,设相同的数出现的位置为\(l ...

  10. BZOJ 3527 力 | FFT

    BZOJ 3527 力 | 分治 题意 给出数组q,$E_i = \sum_{i < j} \frac{q_i}{(i - j) ^ 2} - \sum_{i > j} \frac{q_i ...