`
ljz0721cx
  • 浏览: 12299 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring MVC防止数据重复提交

 
阅读更多
来讲一下如何在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;
    }
}

相应的sping容器的额配置文件自己加上
相关代码已经注释,相信你能看懂。
关于这个方法的用法是:在需要生成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中,可以使用自定义注解来标记需要数据校验的方法或类。首先,...

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

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

    token-springMVC 防止重复提交

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

    Spring 防止重复提交

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

    spring mvc 登陆验证

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

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

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

    springMVC自定义防重复提交

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

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

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

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

    - **数据加密**:对敏感数据进行加密处理,防止数据泄露。 - **权限控制**:根据用户的类型(如学生、学工助理)分配不同的操作权限,避免非法访问。 #### 四、系统特点 - **操作简单**:直观的用户界面,即使是...

    springboot防重复提交工具包

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

    【原创】Struts2防止表单重复提交.doc

    ### Struts2防止表单重复提交的技术解析 #### 一、引言 在Web应用程序开发过程中,表单重复提交是一个常见的问题,特别是在网络环境不稳定或用户误操作的情况下。这种重复提交不仅可能导致数据冗余,还可能引起事务...

    035-prevent-duplicate-form-submission-spring-mvc

    - **服务器端解决方案**:Spring MVC提供了一些服务器端的方法来防止重复提交。 - **令牌校验**:使用`@SessionAttributes`注解创建一个会话属性,比如一个随机生成的令牌。在表单提交时,将令牌作为隐藏字段一起...

    利用struts的token控制重复提交

    Struts的Token机制主要用来防止用户意外或恶意的多次提交表单,例如在刷新页面时重复提交数据。它的工作原理如下: 1. **生成Token**: 当用户访问一个需要防重复提交的表单时,服务器会生成一个唯一的Token并将其...

    struts1的令牌解决页面重复提交问题

    通过以上步骤,Struts1的令牌机制可以有效地防止页面的重复提交,保护业务数据的完整性。然而,随着技术的发展,现代框架如Spring MVC、Struts2等提供了更完善的解决方案,例如利用HTTP的幂等性或一次性令牌(如CSRF...

    Spring-WebFlow入门中文文档

    传统的 Web 应用,如基于 Struts 的应用,通常通过 Action 和视图来处理页面流程,但这种方式会导致流程不清晰,难以复用,并且需要手动处理会话状态和防止重复提交等问题。Spring MVC 提供了一些控制器,如 ...

    Struts高级部分(1)(解决重复提交、上传组件)笔记

    在本文中,我们将深入探讨Struts框架的两个高级特性:如何防止重复提交以及如何实现文件上传功能。 首先,让我们关注重复提交的问题。在Web应用中,用户可能会因为网络延迟或误操作导致同一个表单数据被多次提交,...

    struts2,hibernate,spring,springmvc,mybatis

    国际化(i18n)则涉及如何支持多种语言,而防止重复提交是Web开发中的重要问题,Struts2提供了一种解决方案。 2. **Hibernate**:Hibernate是一个对象关系映射(ORM)框架,简化了数据库操作。`day57_hibernate_多...

    SSM框架面试题.pdf

    - Spring MVC通过`@ModelAttribute`注解和`@RequestParam`注解支持数据绑定。 37. **Spring MVC中的Validator接口的用途** - `Validator`接口用于验证表单提交的数据。可以通过实现该接口来定义自己的验证逻辑。 ...

    springmvc+mybatis

    在 Spring MVC 中集成 MyBatis,首先需要配置 SqlSessionFactory 和 DataSource,然后使用 MyBatis 的 SqlSessionTemplate 或者 SqlSessionDaoSupport 进行数据访问。此外,还可以通过 MyBatis-Spring 插件简化配置...

Global site tag (gtag.js) - Google Analytics