好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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

方法分析:

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

源码实现:

注解token代码:

?

1

2

3

4

5

6

@target (elementtype.method)

@retention (retentionpolicy.runtime)

public @interface token {

   boolean save() default false ;

   boolean remove() default false ;

}

拦截器tokeninterceptor代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

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的配置文件:

?

1

2

3

4

5

6

7

8

<!-- 拦截器配置 -->

   <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里增加下面代码:

?

1

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

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

原文链接:http://blog.icoolxue.com/submitted-by-spring-mvc-to-prevent-data-duplication/

查看更多关于Spring mvc防止数据重复提交的方法的详细内容...

  阅读:17次