package com.zhk.demo.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
public class TimeInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
/*
SpringMVC 中的Interceptor 是鏈式的調用的,在一個應用中或者說是在一個請求中可以同時存在多個Interceptor 。
每個Interceptor 的調用會依據它的聲明順序依次執行,而且最先執行的都是Interceptor 中的preHandle 方法,
所以可以在這個方法中進行一些前置初始化操作或者是對當前請求的一個預處理,
也可以在這個方法中進行一些判斷來決定請求是否要繼續進行下去。
該方法的返回值是布爾值Boolean類型的,當它返回為false 時,
表示請求結束,后續的Interceptor 和Controller 都不會再執行;
當返回值為true 時就會繼續調用下一個Interceptor 的preHandle 方法,
如果已經是最后一個Interceptor 的時候就會是調用當前請求的Controller 方法。
*/
System.out.println("starttime----"+new Date().getTime());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
/*
由preHandle 方法的解釋我們知道這個方法包括后面要說到的afterCompletion
方法都只能是在當前所屬的Interceptor 的preHandle 方法的返回值為true 時才能被調用。
postHandle 方法,顧名思義就是在當前請求進行處理之后,也就是Controller 方法調用之后執行,
但是它會在DispatcherServlet 進行視圖返回渲染之前被調用,所以我們可以在這個方法中對Controller
處理之后的ModelAndView 對象進行操作。postHandle 方法被調用的方向跟preHandle 是相反的,
也就是說先聲明的Interceptor 的postHandle 方法反而會后執行,這和Struts2 里面的Interceptor 的執行過程有點類型。
Struts2 里面的Interceptor 的執行過程也是鏈式的,只是在Struts2 里面需要手動調用ActionInvocation 的invoke 方
法來觸發對下一個Interceptor 或者是Action 的調用,
然后每一個Interceptor 中在invoke 方法調用之前的內容都是按照聲明順序執行的,
而invoke 方法之后的內容就是反向的
*/
System.out.println("開始執行----postHandle()");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
/*
該方法也是需要當前對應的Interceptor 的preHandle 方法的返回值為true 時才會執行。顧名思義,該方法將在整個請求結束之后,
也就是在DispatcherServlet 渲染了對應的視圖之后執行。
這個方法的主要作用是用於進行資源清理工作的。
*/
System.out.println("endtime----"+new Date().getTime());
}
}