spring mvc防止表單重復提交的代碼片段


1.定義一個token接口

 1 package com.bigbigrain.token;
 2 
 3 import java.lang.annotation.Documented;
 4 import java.lang.annotation.Retention;
 5 import java.lang.annotation.Target;
 6 import java.lang.annotation.ElementType;
 7 import java.lang.annotation.RetentionPolicy;
 8 
 9 @Target({ElementType.METHOD})   
10 @Retention(RetentionPolicy.RUNTIME)   
11 @Documented 
12 public @interface Token {
13  boolean save() default false;
14 
15     boolean remove() default false;
16 }

2.實現攔截器

 1 package com.bigbigrain.token;
 2 
 3 import java.lang.reflect.Method;
 4 import java.util.UUID;
 5 
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 
 9 import org.apache.log4j.Logger;
10 import org.springframework.web.method.HandlerMethod;
11 import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
12 
13 public class TokenInterceptor extends HandlerInterceptorAdapter {
14     private static final Logger LOG = Logger.getLogger(Token.class);
15     @Override
16     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
17         if (handler instanceof HandlerMethod) {
18             HandlerMethod handlerMethod = (HandlerMethod) handler;
19             Method method = handlerMethod.getMethod();
20             Token annotation = method.getAnnotation(Token.class);
21             if (annotation != null) {
22                 boolean needSaveSession = annotation.save();
23                 if (needSaveSession) {
24                     request.getSession(true).setAttribute("token", UUID.randomUUID().toString());
25                 }
26                 boolean needRemoveSession = annotation.remove();
27                 if (needRemoveSession) {
28                     if (isRepeatSubmit(request)) {
29                          LOG.warn("please don't repeat submit,url:"+ request.getServletPath());
30                         return false;
31                     }
32                     request.getSession(true).removeAttribute("token");
33                 }
34             }
35             return true;
36         } else {
37             return super.preHandle(request, response, handler);
38         }
39     }
40 
41     private boolean isRepeatSubmit(HttpServletRequest request) {
42         String serverToken = (String) request.getSession(true).getAttribute("token");
43         if (serverToken == null) {
44             return true;
45         }
46         String clinetToken = request.getParameter("token");
47         if (clinetToken == null) {
48             return true;
49         }
50         if (!serverToken.equals(clinetToken)) {
51             return true;
52         }
53         return false;
54     }
55 }

3.配置文件配置

1 ~<!-- 攔截器配置 -->
2 <mvc:interceptors>
3         <!-- 配置Token攔截器,防止用戶重復提交數據 -->
4         <mvc:interceptor>
5             <mvc:mapping path="/**"/><!--這個地方時你要攔截得路徑 我這個意思是攔截所有得URL-->
6             <bean class="com.dinfo.interceptor.TokenInterceptor"/><!--class文件路徑改成你自己寫得攔截器路徑!! -->
7         </mvc:interceptor>
8 </mvc:interceptors>
4.在跳轉需要生成token頁面的controller的方法加上注解~@Token(save=true);頁面加上~<input type="hidden" name="token" value="${token}" />;在頁面提交處理方法上加上~@Token(remove=true)注解

===========》》》》》

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM