spring的攔截器

方式:java

一、實現接口:org.springframework.web.servlet.HandlerInterceptorweb

二、繼承抽象類:org.springframework.web.servlet.handler.HandlerInterceptorAdapterspring

spring配置文件:
apache

<mvc:interceptors>
    <mvc:interceptor>
       <mvc:mapping path="/restapi/user/identifycode/**" />
       <mvc:mapping path="/restapi/user/email/edit" />
       <bean class="com.maijia.ucenter.rest.web.interceptors.IdentifyCodeInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

全局攔截器:api

<mvc:interceptors>  
    <bean class="com.app.mvc.MyInteceptor" />  
</mvc:interceptors>
或
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">   <property name="interceptors">       
     <list>       
         <bean class="com.mvc.MyInteceptor"></bean>      
     </list>       
  </property>       
</bean>

攔截器類:緩存

package com.caiya.ucenter.rest.web.interceptors;

import java.util.Date;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.caiya.ucenter.rest.web.utils.ClientIpUtils;
import com.caiya.cache.ICache;

/**
 * 短信校驗碼攔截器,只容許60秒以後重發一次
 * ADD 郵箱驗證碼
 * 涉及找回密碼 & 綁定郵箱
 */
public class IdentifyCodeInterceptor extends HandlerInterceptorAdapter {

   @Resource
   private ICache cache;
   
   private static Logger logger = Logger.getLogger(IdentifyCodeInterceptor.class);
   
   @Override
   public boolean preHandle(HttpServletRequest request,
         HttpServletResponse response, Object handler) throws Exception {
      String path = request.getRequestURI();
      String ip = ClientIpUtils.getClientIP(request);
      if(path.contains("/restapi/user/identifycode/sms")){
         // 發送短信驗證碼
         String mobile = request.getParameter("mobile");
         if(cache.get(createCacheKey(mobile)) != null){
            logger.error(new StringBuilder("ip:").append(ip).append(",mobile:").append(mobile).append(" 在1分鐘內再次請求短信驗證碼,請求拒絕!"));
            throw new IllegalAccessException("短信驗證碼需在1分鐘以後再次請求!");
         }
      }else if(path.contains("/restapi/user/identifycode/email") || path.contains("/restapi/user/email/edit")){
         // 發送郵箱驗證碼
         String email = request.getParameter("email");
         if(cache.get(createCacheKey(email)) != null){
            logger.error(new StringBuilder("ip:").append(ip).append(",email:").append(email).append(" 在1分鐘內再次請求郵箱驗證碼,請求拒絕!"));
            throw new IllegalAccessException("郵箱驗證碼需在1分鐘以後再次請求!");
         }
      }

      // ip另外限制
      if(cache.get(createCacheKey(ip)) != null){
         logger.error(new StringBuilder("ip:").append(ip).append(",ip:").append(ip).append(" 在1分鐘內再次請求驗證碼,請求拒絕!"));
         throw new IllegalAccessException("驗證碼請求需在1分鐘以後再次請求!");
      }
      return super.preHandle(request, response, handler);
   }
   
   @Override
   public void postHandle(HttpServletRequest request,
         HttpServletResponse response, Object handler,
         ModelAndView modelAndView) throws Exception {
      String path = request.getRequestURI();
      String ip = ClientIpUtils.getClientIP(request);
      if(path.contains("/restapi/user/identifycode/sms")){
         // 發送短信驗證碼
         String mobile = request.getParameter("mobile");
         try{
            // 通常1分鐘過時,若是在preHandle中獲取到這個緩存,那麼不容許他繼續下去
            cache.set(createCacheKey(mobile), new Date(), 60);
         }catch(Exception e){
            logger.error(e.getMessage(), e);
         }
      }else if(path.contains("/restapi/user/identifycode/email") || path.contains("/restapi/user/email/edit")){
         // 發送郵箱驗證碼
         String email = request.getParameter("email");
         try{
            // 通常1分鐘過時,若是在preHandle中獲取到這個緩存,那麼不容許他繼續下去
            cache.set(createCacheKey(email), new Date(), 60);
         }catch(Exception e){
            logger.error(e.getMessage(), e);
         }
      }
      // ip另外限制
      try{
         // 通常1分鐘過時,若是在preHandle中獲取到這個緩存,那麼不容許他繼續下去
         cache.set(createCacheKey(ip), new Date(), 60);
      }catch(Exception e){
         logger.error(e.getMessage(), e);
      }
      super.postHandle(request, response, handler, modelAndView);
   }
   
   private String createCacheKey(String address){
      return new StringBuilder("ic_").append(address).toString();
   }

}
相關文章
相關標籤/搜索