`

Spring MVC防重复提交

 
阅读更多
http://my.oschina.net/zyqjustin/blog/692789
如何在Spring MVC里面解决此问题(其它框架也一样,逻辑一样,思想一样,和具体框架没什么关系)。要解决重复提交,有很多办法,比如说在提交完成后redirect一下,也可以用本文提到的使用token的方法(我不使用redirect是因为那样解决不了ajax提交数据或者移动应用提交数据,另一个原因是现在比较通行的方法是使用token,像python里的django框架也是使用token来解决)。

使用token的逻辑是,给所有的url加一个拦截器,在拦截器里面用java的UUID生成一个随机的UUID并把这个UUID放到session里面,然后在浏览器做数据提交的时候将此UUID提交到服务器。服务器在接收到此UUID后,检查一下该UUID是否已经被提交,如果已经被提交,则不让逻辑继续执行下去…

好的,来点实际代码,也许实际代码才是最好的老师:

注解Token代码:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Token {

    boolean save() default false;

    boolean remove() default false;
}




拦截器TokenInterceptor代码:

public class TokenInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();
            Token annotation = method.getAnnotation(Token.class);
            if (annotation != null) {
                boolean needSaveSession = annotation.save();
                if (needSaveSession) {
                    request.getSession(false).setAttribute("token", UUID.randomUUID().toString());
                }
                boolean needRemoveSession = annotation.remove();
                if (needRemoveSession) {
                    if (isRepeatSubmit(request)) {
                        return false;
                    }
                    request.getSession(false).removeAttribute("token");
                }
            }
            return true;
        } else {
            return super.preHandle(request, response, handler);
        }
    }

    private boolean isRepeatSubmit(HttpServletRequest request) {
        String serverToken = (String) request.getSession(false).getAttribute("token");
        if (serverToken == null) {
            return true;
        }
        String clinetToken = request.getParameter("token");
        if (clinetToken == null) {
            return true;
        }
        if (!serverToken.equals(clinetToken)) {
            return true;
        }
        return false;
    }
}




然后在Spring MVC的配置文件里加入:注意,要在*-servlet。xml里面配置

    <!-- 拦截器配置 -->
    <mvc:interceptors>
        <!-- 配置Shiro拦截器,实现注册用户的注入 -->
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.storezhang.video.shiro.ShiroInterceptor"/>
        </mvc:interceptor>
        <!-- 配置Token拦截器,防止用户重复提交数据 -->
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.storezhang.web.spring.TokenInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

相关代码已经注释,相信你能看懂。


关于这个方法的用法是:在需要生成token的controller上增加@Token(save=true),而在需要检查重复提交的controller上添加@Token(remove=true)就可以了。
另外,你需要在view里在form里增加下面代码:

<input type="hidden" name="token" value="${token}" />
分享到:
评论

相关推荐

    Spring mvc防止数据重复提交的方法

    Spring MVC 防止数据重复提交的方法 Spring MVC 防止数据重复提交的方法是使用 Token 机制来实现的,该机制通过在服务器端生成一个随机的 UUID,并将其存储在 Session 中,然后在客户端提交数据时带上该 UUID,...

    Spring MVC接口防数据篡改和重复提交

    Spring MVC接口防数据篡改和重复提交 Spring MVC框架中,数据篡改和重复提交是常见的安全问题,本文将详细介绍如何使用Spring MVC防止数据篡改和重复提交。 一、自定义注解 在Spring MVC中,可以使用自定义注解来...

    token-springMVC 防止重复提交

    在Spring MVC框架中,防止重复提交是一个重要的议题,特别是在处理敏感数据或执行不可逆操作时。重复提交可能会导致数据不一致性和系统混乱。"Token-SpringMVC"是一种常见的解决方案,它利用令牌(Token)机制来确保...

    springboot2.1+redis+拦截器 防止表单重复提交

    在现代Web应用开发中,防止表单重复提交是一项重要的任务,因为这可能导致数据不一致性和服务器资源浪费。本文将深入探讨如何使用Spring Boot 2.1、Redis和拦截器来实现这一功能。以下是对这个主题的详细解释: ...

    Spring 防止重复提交

    在Spring框架中,防止重复提交是一项重要的功能,它有助于确保数据的一致性和完整性。重复提交可能会导致数据库中的数据不一致,特别是在并发环境下。本篇将详细介绍如何在Spring中实现这一功能,主要分为四个步骤:...

    Spring注解方式防止重复提交原理详解

    Spring 注解方式防止重复提交原理详解 Spring 注解方式防止重复提交原理详解是 Spring 框架中的一种防止重复提交的方法。该方法通过使用注解和拦截器来实现防止重复提交。 首先,我们需要定义一个 annotation,名...

    Servlet、Struts、SpringMVC对于表单重复提交的解决方案

    3. **Spring的拦截器(Interceptor)**:可以自定义拦截器,实现`HandlerInterceptor`接口,其中的`postHandle()`方法可以用来处理表单提交后的状态,防止重复提交。 4. **令牌(Token)机制**:与Servlet中的令牌...

    spring mvc 登陆验证

    登录成功后,可以使用RedirectAttributes进行重定向,以防止表单重复提交。 **8. CSRF防护** 为了增强安全性,还需要考虑跨站请求伪造(CSRF)攻击的防护。Spring Security默认提供了CSRF保护,可以通过配置关闭或...

    springMVC自定义防重复提交

    在Spring MVC框架中,防重复提交是一个常见的需求,特别是在处理重要的业务操作时,如订单创建、用户注册等。重复提交可能会导致数据不一致,影响系统的稳定性。本篇将详细介绍如何在Spring MVC中自定义实现防重复...

    spring mvc+mybaties框架

    3. **AOP(面向切面编程)**:Spring的AOP功能可用于实现通用的日志记录、性能监控等功能,减少重复代码。 4. **Spring MVC的ModelAndView与MyBatis的结合**:在Controller中调用MyBatis的Mapper方法,将查询结果放...

    单元测试案例junit +spring mvc +springboot

    JUnit作为Java领域最流行的单元测试框架,与Spring MVC和Spring Boot的集成使得开发者能够更高效地进行测试驱动开发(TDD)或行为驱动开发(BDD)。下面将详细介绍这个主题中的相关知识点。 1. JUnit JUnit是一个...

    spring MVC Web应用中集成Jasper报表工具

    在Spring MVC Web应用程序中集成Jasper报表工具是一个常见的需求,以提供动态生成和展示各种复杂数据的报表。JasperReports是一款强大的开源报表库,能够帮助开发者创建、设计和展示多种格式的报表,如PDF、HTML、...

    spring mvc 经典面试题

    在Spring MVC中,所有请求都会被提交给一个名为DispatcherServlet的中央调度器。这个调度器会根据配置,将请求分派给相应的Controller,即处理器。在Controller处理完毕后,会返回一个ModelAndView对象,该对象既...

    基于Spring+Spring MVC+Mybatis的用户账号注册和密码修改.zip

    本项目基于Java技术栈,具体使用了Spring、Spring MVC和Mybatis这三大框架,它们共同构成了一个强大的后端处理机制。下面将详细介绍这三个组件以及在用户注册和密码修改场景中的应用。 **1. Spring框架** Spring是...

    Spring MVC控制器之SimpleFormController使用

    在Java Web开发中,Spring MVC框架是一个非常流行的MVC(模型-视图-控制器)架构模式实现,它为开发者提供了构建高效、灵活且可维护的Web应用的强大工具。本篇文章将详细探讨`Spring MVC`中的`SimpleFormController`...

    Spring MVC面试题(2022最新版)

    - **设计模式**:Spring MVC遵循传统的MVC模式,而Struts2则采用了拦截器模式。 - **灵活性**:Spring MVC提供了更多的灵活性,因为它是基于POJO的,而Struts2则是基于API的。 - **配置**:Spring MVC更倾向于使用...

    Spring MVC面试试题

    ### Spring MVC面试试题详解 #### 一、Spring MVC框架的核心组件与流程 1. **DispatcherServlet的作用**:作为Spring MVC框架的前端控制器,DispatcherServlet是整个请求处理过程的起点,负责接收客户端请求,并将...

    springboot防重复提交工具包

    9. **拦截器/过滤器**:在Spring Boot中,可以使用Spring MVC的拦截器或Filter来拦截请求,实现请求的预处理和后处理,包括防重复提交的逻辑。 10. **AOP(面向切面编程)**:通过定义切面,可以在方法执行前后添加...

    基于Spring MVC的高校学院学工助理系统的设计与实现.docx

    ### 基于Spring MVC的高校学院学工助理系统的设计与实现 #### 一、引言 随着互联网技术的发展和普及,高校管理信息化已经成为一种趋势。为了提高学工助理的工作效率,更好地服务师生,本研究设计并实现了基于...

    springMVC中基于token防止表单重复提交方法

    SpringMVC中基于Token防止表单重复提交方法 SpringMVC中基于Token防止表单重复提交方法是指通过在SpringMVC配置文件中添加拦截器配置,来拦截页面请求和表单提交请求,以防止表单重复提交。下面是该方法的实现思路...

Global site tag (gtag.js) - Google Analytics