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

 更新时间:2018年11月27日 10:37:16   投稿:lijiao  
这篇文章主要为大家详细介绍了Spring mvc防止数据重复提交的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Spring mvc如何防止数据重复提交,供大家参考,具体内容如下

方法分析:

这里使用的防止数据重复提交的方法是使用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的配置文件:

<!-- 拦截器配置 -->
  <mvc:interceptors>
    <!-- 配置Token拦截器,防止用户重复提交数据 -->
    <mvc:interceptor>
      <mvc:mapping path="/**"/>
      <bean class="com.storezhang.web.spring.TokenInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

使用方法:

1、在需要生成token的controller上增加@Token(save=true);
2、而在需要检查重复提交的controller上添加@Token(remove=true)就可以了。

另外,你需要在view里在form里增加下面代码:

<input type="hidden" name="token" value="${token}" />

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java单例模式简单介绍

    Java单例模式简单介绍

    这篇文章主要为大家详细介绍了Java单例模式简单的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • JAVA JDK8 List分组的实现和用法

    JAVA JDK8 List分组的实现和用法

    今天小编就为大家分享一篇关于JAVA JDK8 List分组的实现和用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 深入理解DevOps+微服务框架

    深入理解DevOps+微服务框架

    这篇文章主要介绍了深入理解DevOps+微服务,主要包括DevOps 的三大支柱之中,即人(People)、流程(Process)和平台(Platform)的知识讲解,需要的朋友可以参考下
    2022-05-05
  • 深度解析Java中CountDownLatch的原理

    深度解析Java中CountDownLatch的原理

    在高并发编程中,AbstractQueuedSynchronizer(简称AQS)抽象的队列同步器是我们必须掌握的,本文将通过CountDownLatch底层实现原理来了解AQS共享锁模式的实现原理,快跟随小编一起学习学习吧
    2023-07-07
  • SSH框架网上商城项目第2战之基本增删查改、Service和Action的抽取

    SSH框架网上商城项目第2战之基本增删查改、Service和Action的抽取

    SSH框架网上商城项目第2战之基本增删查改、Service和Action的抽取,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 全面汇总SpringBoot和SpringClould常用注解

    全面汇总SpringBoot和SpringClould常用注解

    Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能,这篇文章就带你来了解一下
    2021-08-08
  • javamail 发送邮件的实例代码分享

    javamail 发送邮件的实例代码分享

    今天学习了一下JavaMail,javamail发送邮件确实是一个比较麻烦的问题。为了以后使用方便,自己写了段代码,打成jar包,以方便以后使用
    2013-08-08
  • SpringBoot热部署和整合Mybatis的过程

    SpringBoot热部署和整合Mybatis的过程

    热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用,本文给大家详细介绍SpringBoot热部署和整合Mybatis的过程,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • Java连接六类数据库技巧全攻略

    Java连接六类数据库技巧全攻略

    本文主要为大家介绍了Java与Oracle、DB2、Sql Server、Sybase、MySQL、PostgreSQL等数据库连接的方法。
    2015-09-09
  • 解决lambda表达式内出现异常无法throw抛出的问题

    解决lambda表达式内出现异常无法throw抛出的问题

    这篇文章主要介绍了lambda表达式内出现异常无法throw抛出的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论