在控制層進行訪問攔截也是我們在項目中常會遇到的需求,例如:項目中要求系統登錄操作有時間限制--12306購票時間的限制等.
對于這類需求我們一般有幾種選擇:
- 過濾器Filter
- AOP
- SpringMVC攔截器...
本文我們主要說一下SpringMVC攔截器的實現
原理
Spring MVC的攔截器是基于回調機制,可以在目標方法執行之前/之后,做一些處理.
如下圖所示:

客戶端的請求通過前端控制器會被HandleInterceptor攔截器攔截,會根據攔截器的方法(preHandle/postHandle),分別在Controller層的目標方法之前或之后只寫一些業務.
實現
我們要實現的是登錄前的攔截,然后進行時間判定--所以我們需要用preHandle方法,可以在目標方法執行之前,先進行業務檢測,滿足條件則放行,不滿足條件則進行攔截
具體實現分為兩步:
- 定義攔截器:
public class TimeAccessInterceptor implements HandlerInterceptor{ /** 此方法會在你的目標Controller執行之前執行 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("==preHandler=="); LocalDateTime now = LocalDateTime.now();//JDK8的新特性 int hour = now.getHour(); System.out.println("hour:"+hour); if(hour<9||hour>19) throw new ServiceException("不在訪問時間:9~14");//return false return true;//true表示放行,false表示請求到此結束 }}
我們自己創建一個類并且實現HandlerInterceptor攔截器接口,然后根據你的業務需求實現方法,我們這里實現的是preHandle方法用于在controller執行之前執行,通過JDK8的新特性--LocalDateTime.now()來獲取當前時間,可以再通過now.getHoure()等方法來獲取具體的小時/分鐘/秒等.在判斷是否在我們禁止登陸的時間范圍內,如果是則拋出異常(這里ServiceException是我們自己定義的異常類),拋出異常==return false,返回值return true表示放行,false表示攔截結束.
- 對攔截器進行配置
@Configurationpublic class SpringWebConfig implements WebMvcConfigurer { /** * 注冊攔截器 */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new TimeAccessInterceptor()) .addPathPatterns("/user/doLogin"); }}
創建一個SpringWebConfig類并且實現WebMvcConfigurer接口,類由@Configuration注解描述,表示是一個配置類,重寫實現類中的addInterceptors方法,參數InterceptorRegistry registry攔截器集合,調用addInterceptor(new TimeAccessInterceptor())向其中添加我們定義的攔截器類,在調用addPathPatterns("/user/doLogin"),添加要攔截的路徑,()內就是我們登陸的路徑.