利用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. 微信小程序之Flex布局

    微信小程序页面布局方式采用的是Flex布局.Flex布局,是W3c在2009年提出的一种新的方案,可以简便,完整,响应式的实现各种页面布局.Flex布局提供了元素在容器中的对齐,方向以及顺序,甚至他们 ...

  2. 第一个spring冲刺心得及感想

    在这次spring中,学到了不少东西: 1.团队协作精神 2.任务细节化,任务燃尽图 3.身为sm的责任 但是在过程中也认识到了一些不足 1.对于团队协作完成一个大的项目还是不熟悉 2.个人能力的不足 ...

  3. Appium 服务关键字(转)

    来源: https://github.com/appium/appium/blob/master/docs/cn/writing-running-appium/caps.cn.md#appium-服务 ...

  4. Js apply方法详解,及其apply()方法的妙用

    Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...

  5. Linux上两种网络连接方式

    模式一:NAT方式好处:路由器更换,或者交换机更换,网络仍然可以使用,所用使用最多 准备工作: 查看VMware服务器启动情况,五个全开模式 vmnet8开启模式 1 配置VMware交换机的ip地址 ...

  6. python3+selenium3+requests爬取我的博客粉丝的名称

    爬取目标 1.本次代码是在python3上运行通过的 selenium3 +firefox59.0.1(最新) BeautifulSoup requests 2.爬取目标网站,我的博客:https:/ ...

  7. springmvc+mybatis 处理时间

    项目结构: 一.数据库中time的字段为datetime1. 数据库设计如图 2. addNews.jsp <%@ page language="java" contentT ...

  8. 【刷题】HDU 6183 Color it

    Problem Description Do you like painting? Little D doesn't like painting, especially messy color pai ...

  9. 【刷题】洛谷 P1519 穿越栅栏 Overfencing

    题目描述 描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意 ...

  10. BZOJ 3339: Rmq Problem

    3339: Rmq Problem Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1075  Solved: 549[Submit][Status][ ...