温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在Spring mvc中防止数据重复提交

发布时间:2021-05-21 16:12:24 来源:亿速云 阅读:171 作者:Leah 栏目:编程语言

今天就跟大家聊聊有关怎么在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}" />

看完上述内容,你们对怎么在Spring mvc中防止数据重复提交有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI