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; 
 | 
    } 
 | 
  
 | 
} 
 |