1、開發步驟:java
① 引入JAR文件程序員
②定義攔截器類,實現HandlerInterceptor該接口,重寫方法web
注:preHandle()返回值是falsespring
public class FirstInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("MyInterceptor.preHandle()"); return false; } @Override public void postHandle(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor.postHandl()"); } @Override public void afterCompletion(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("MyInterceptor.afterCompletion()"); }
下面對代碼中的三個方法進行解釋。mvc
preHandle():這個方法在業務處理器處理請求以前被調用,在該方法中對用戶請求request進行處理。若是程序員決定該攔截器對請求進行攔截處理後還要調用其餘的攔截器,或者是業務處理器去進行處理,則返回true;若是程序員決定不須要再調用其餘的組件去處理請求,則返回false。app
postHandle():這個方法在業務處理器處理完請求後,可是DispatcherServlet向客戶端返回請求前被調用,在該方法中對用戶請求request進行處理。jsp
afterCompletion():這個方法在DispatcherServlet徹底處理完請求後被調用,能夠在該方法中進行一些資源清理的操做。ide
③ 定義控制器方法post
@Controller public class MyController { @RequestMapping("/first.do") public String doFirst(){ return "/index.jsp"; }
④Web.xml:url
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
⑤ 配置applicationContext.xml,自定義攔截器
控制檯輸出以下:
注:preHandle()返回值是true. 接到請求後,根據返回值類型斷定,爲true則執行第一個方法,
隨後執行處理器方法。最後通過一系列執行返回客戶端響應
⑥定義多個攔截器
注:在兩個類的preHandler方法返回值爲true的狀況下:
執行流程以下:
注:當第一個攔截器類方法爲true,第二個爲false時,執行效果以下:
第一道爲true,則繼續執行,會執行到第二個攔截器的preHandler()。在這時,返回值是false,則不繼續走控制器方法,
反之,不通過postHandler(),但會響應afterCompletion()。
注:若兩個攔截器方法返回值都爲false。
則只會執行第一個攔截器的方法。後續則都不執行