利用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. mac下搭建MySql环境

    准备工作做完后,开始: 创建数据库 step1: 在mac中->系统偏好设置->最下边点MySQL 在弹出页面中 关闭mysql服务(点击stop mysql server) step2: ...

  2. rpm安装和二进制安装

    rpm包安装 Tomcat RPM安装(先安装JDK + 再安装Tomcat) 1:升级系统自带的JDK(也可以使用oracle的JDK) yum install -y java-1.8.0-open ...

  3. win32.gui.api.con(前置,鼠标点击,发送数据的Dome)

    # -*- coding: UTF-8 -*- import win32gui, win32con import os import time import win32gui import win32 ...

  4. web安全测试系统

    最近写了个简单的web安全实践系统部署到了docker中 下载方式:docker pull ju5ton1y/websecurity github Dockerfile下载地址:https://git ...

  5. java中的Serializable接口的作用

    实现java.io.Serializable 接口的类是可序列化的.没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化. 序列化类的所有子类本身都是可序列化的.这个序列化接口没有任何方法和域, ...

  6. springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin

    相信现在已经有很多小伙伴已经或者准备使用springcloud微服务了,接下来为大家搭建一个微服务框架,后期可以自己进行扩展.会提供一个小案例: 服务提供者和服务消费者 ,消费者会调用提供者的服务,新 ...

  7. Day24-part1-原生Ajax

    参考老师博客:http://www.cnblogs.com/wupeiqi/articles/5703697.html 主要讲了:发数据的3种方式以及上传文件的3种方式.(后续需要总结) 一,原生Aj ...

  8. c++11 函数模板的默认模板参数

    c++11 函数模板的默认模板参数 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> ...

  9. Spring点滴七:Spring中依赖注入(Dependency Injection:DI)

    Spring机制中主要有两种依赖注入:Constructor-based Dependency Injection(基于构造方法依赖注入) 和 Setter-based Dependency Inje ...

  10. ajax请求提交到controller后总是不成功

    最近在做实习时,点击查询时在js中发送ajax请求到controller后台,但是无论怎么样都不成功,请求地址是正确的,因为在后台用system.out.println输出有值,并且也确实return ...