方式: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(); } }