| package com.matrix.system.common.interceptor; | 
|   | 
| import com.matrix.core.anotations.RemoveRequestToken; | 
| import com.matrix.core.anotations.SaveRequestToken; | 
| import com.matrix.core.exception.GlobleException; | 
| import org.springframework.web.method.HandlerMethod; | 
| import org.springframework.web.servlet.ModelAndView; | 
| import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; | 
|   | 
| import javax.servlet.http.HttpServletRequest; | 
| import javax.servlet.http.HttpServletResponse; | 
| import javax.servlet.http.HttpSession; | 
| import java.lang.reflect.Method; | 
| import java.util.UUID; | 
|   | 
| /** | 
|  * 防止重复提交的拦截器 | 
|  *  | 
|  * @author jiangyouyao 2016.08.19 | 
|  * | 
|  */ | 
| public class DuplicateSubmitInterceptor extends HandlerInterceptorAdapter { | 
|   | 
|     @Override | 
|     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) | 
|             throws Exception { | 
|         HandlerMethod handlerMethod = (HandlerMethod) handler; | 
|         Method method = handlerMethod.getMethod(); | 
|         SaveRequestToken saveToken = method.getAnnotation(SaveRequestToken.class); | 
|         RemoveRequestToken removeToken = method.getAnnotation(RemoveRequestToken.class); | 
|         HttpSession session = request.getSession(); | 
|         if (saveToken != null) { | 
|             String token = UUID.randomUUID().toString(); | 
|             String tokenUrl = request.getServletPath(); | 
|             session.setAttribute("token", token); | 
|             session.setAttribute("tokenUrl", tokenUrl); | 
|             session.setAttribute(tokenUrl, token); | 
|             // 保存操作,验证是否重复提交 | 
|         } else if (removeToken != null) { | 
|             String clinetToken = request.getParameter("token"); | 
|             String url = request.getParameter("tokenUrl"); | 
|             String serverToken = (String) session.getAttribute(url); | 
|             // 判断是否是重复提交了,是的话抛出异常 | 
|             boolean isReapet = isRepeatSubmit(clinetToken, serverToken); | 
|             if (isReapet) { | 
|                 throw new GlobleException("重复提交"); | 
|             } | 
|         } | 
|         return super.preHandle(request, response, handler); | 
|     } | 
|   | 
|     @Override | 
|     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, | 
|             ModelAndView modelAndView) throws Exception { | 
|         HandlerMethod handlerMethod = (HandlerMethod) handler; | 
|         Method method = handlerMethod.getMethod(); | 
|         RemoveRequestToken removeToken = method.getAnnotation(RemoveRequestToken.class); | 
|         if (removeToken != null) { | 
|             // 提交后则清除session | 
|             HttpSession session = request.getSession(); | 
|             String url = request.getParameter("tokenUrl"); | 
|             session.removeAttribute(url); | 
|         } | 
|         super.postHandle(request, response, handler, modelAndView); | 
|     } | 
|   | 
|     private boolean isRepeatSubmit(String clinetToken, String serverToken) { | 
|         // 没有进入编辑页面,直接访问url,则服务端的token为空,不允许提交,视为重复提交 | 
|         if (serverToken == null) { | 
|             return true; | 
|         } | 
|         if (clinetToken == null) { | 
|             return true; | 
|         } | 
|         // 传过来的和保存在session中的token不一致的话是重复 | 
|         if (!serverToken.equals(clinetToken)) { | 
|             return true; | 
|         } | 
|         return false; | 
|     } | 
|   | 
| } |