利用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. Enterprise Library 3.1 参考源码索引

    http://www.projky.com/entlib/3.1/Microsoft/Practices/EnterpriseLibrary/AppSettings/Configuration/Des ...

  2. ps -aux 命令下的前几行内容解释 与 top命令下的前几行内容解释

    系统进程分为5种不同的状态: R(运行):正在运行或在运行队列中等待 S(中断):休眠中,在等待某个条件的形成或接受到信号 D(不可中断):收到信号不唤醒和不可运行.进程必须等待直到有中断发生 Z(僵 ...

  3. ajax 数据请求(一)同域

    参考:http://www.css88.com/jqapi-1.9/jQuery.ajax/ http://www.cnblogs.com/haitao-fan/p/3908973.html 1.常用 ...

  4. [转帖]Cgroups 与 Systemd

    Cgroups 与 Systemd 大神的文章很牛B .. https://www.cnblogs.com/sparkdev/p/9523194.html 看不太懂 , 转帖一下 自己留着好好看呢. ...

  5. 数组 javaScript权威指南笔记

    创建数组 var a=[1,2,3,4] var arr=new Array() var arr=new Array(10);//创建长度为10的数组   var arr=new Array(1,2, ...

  6. ACM数论之旅9---中国剩余定理(CRT)(壮哉我大中华╰(*°▽°*)╯)

    中国剩余定理,又名孙子定理o(*≧▽≦)ツ 能求解什么问题呢? 问题: 一堆物品 3个3个分剩2个 5个5个分剩3个 7个7个分剩2个 问这个物品有多少个 解这题,我们需要构造一个答案 我们需要构造这 ...

  7. luogu P2992 [USACO10OPEN]三角形计数Triangle Counting

    https://www.luogu.org/problemnew/solution/P2992 考虑包含原点,不包含原点的三角形有什么特征. 包含原点的三角形:任意找一个顶点和原点连线,一定能把另外两 ...

  8. 基于c的简易计算器二

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> ...

  9. VRRP主备备份配置示例—实现网关冗余备份

    本示例的基本拓扑结构如图所示. HostA通过Switch 双线连接到RouterA 和RouterB .用户希望实现:正常情况下, 主机以RouterA 为默认网关接入Intemet; 而当Rout ...

  10. Post Lamps CodeForces - 990E(暴力出奇迹?)

    题意: 在一个从0开始的连续区间上  放置几个小区间,使得这些小区间覆盖整个大区间,不同长度的小区间有不同的花费,其中有m个点,小区间的左端点不能放在这些点上 解析: 显然如果0是这m点中的一个 则无 ...