原文連接:http://www.yiidian.com/springmvc/interceptor.htmlhtml
Spring MVC中的攔截器(Interceptor)相似於Servlet中的過濾器(Filter),它主要用於攔截用戶請求並做相應的處理。例如經過攔截器能夠進行權限驗證、記錄請求信息的日誌、判斷用戶是否登陸等。java
要使用Spring MVC中的攔截器,就須要對攔截器類進行定義和配置。一般攔截器類能夠經過兩種方式來定義。web
經過實現HandlerInterceptor接口 繼承HandlerInterceptor接口的實現類(如:HandlerInterceptorAdapter)來定義。spring
首先,爲了演示Spring MVC攔截器的效果,咱們先定義一個目標控制器session
HelloController目標控制器:mvc
package com.yiidian.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.*; import java.util.UUID; /** * 目標控制器 * 一點教程網 - www.yiidian.com */ @Controller public class HelloController { @RequestMapping("/hello") public String upload(HttpSession session, HttpServletResponse response) throws Exception { System.out.println("3.目標控制器-HelloController"); return "success"; } }
這裏咱們定義2個Spring MVC攔截器,並且這2個攔截器同時攔截器一個目標控制器,你們注意看最後的執行順序。app
Demo1Interceptor第一個攔截器:yii
package com.yiidian.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 自定義攔截器 *一點教程網 - www.yiidian.com */ public class Demo1Interceptor implements HandlerInterceptor{ /** *preHandle: 在控制器(目標)的方法以前被執行 * 返回值:控制afterCompletion方法是否被執行 * true: 執行afterCompletion * false: 不執行afterCompletion */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("1.Demo1Interceptor的preHandle"); return true; } /** * postHandle: 在控制器(目標)的方法成功執行完成以後(注意:控制器方法失敗不執行) */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("5.Demo1Interceptor的postHandle"); } /** * afterCompletion: 在執行完前面全部(攔截器和目標)的方法以後執行(注意: 無論控制器方法執行成功與否都會被執行 ) */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("7.Demo1Interceptor的afterCompletion"); } }
Demo2interceptor第二個攔截器:ide
package com.yiidian.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 自定義攔截器 *一點教程網 - www.yiidian.com */ public class Demo2Interceptor implements HandlerInterceptor{ /** *preHandle: 在控制器(目標)的方法以前被執行 * 返回值:控制afterCompletion方法是否被執行 * true: 執行afterCompletion * false: 不執行afterCompletion */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("2.Demo2Interceptor的preHandle"); return true; } /** * postHandle: 在控制器(目標)的方法成功執行完成以後(注意:控制器方法失敗不執行) */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("4.Demo2Interceptor的postHandle"); } /** * afterCompletion: 在執行完前面全部(攔截器和目標)的方法以後執行(注意: 無論控制器方法執行成功與否都會被執行 ) */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("6.Demo2Interceptor的afterCompletion"); } }
注意:一個攔截器和多個攔截器的執行順序看下圖。post
一個攔截器的執行順序:
多個攔截器的執行順序:
<!-- 配置攔截器 --> <mvc:interceptors> <!-- 配置2個攔截器 --> <mvc:interceptor> <mvc:mapping path="/hello"/> <bean class="com.yiidian.interceptor.Demo1Interceptor"/> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/hello"/> <bean class="com.yiidian.interceptor.Demo2Interceptor"/> </mvc:interceptor> </mvc:interceptors>
注意:攔截器配置的順序決定了攔截器的執行順序,先配置會先被執行!
訪問:http://localhost:8080/hello
控制檯輸出效果以下:
源碼下載:https://pan.baidu.com/s/1myzqCpvlhVb4aJkb5aucdQ
歡迎關注個人公衆號::一點教程。得到獨家整理的學習資源和平常乾貨推送。 若是您對個人系列教程感興趣,也能夠關注個人網站:yiidian.com