1. 程式人生 > 程式設計 >Spring MVC 攔截器 interceptor 用法詳解

Spring MVC 攔截器 interceptor 用法詳解

Spring MVC-攔截器
今天就是把有關攔截器的知識做一個總結。

1.攔截器概述

1.1 什麼是攔截器?

Spring MVC中的攔截器(Interceptor)類似於Servlet中的過濾器(Filter),它主要用於攔截使用者請求並作相應的處理。例如通過攔截器可以進行許可權驗證、記錄請求資訊的日誌、判斷使用者是否登入等。
要使用Spring MVC中的攔截器,就需要對攔截器類進行定義和配置。通常攔截器類可以通過兩種方式來定義。

1.通過實現HandlerInterceptor介面,或繼承HandlerInterceptor介面的實現類(如HandlerInterceptorAdapter)來定義。

2.通過實現WebRequestInterceptor介面,或繼承WebRequestInterceptor介面的實現類來定義。

以實現HandlerInterceptor介面方式為例,自定義攔截器類的程式碼如下:

package com.mmm.interceptors;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
* 建立自定義的攔截器
01.務必實現 HandlerInterceptor!
02.我們使用的攔截器其實就是針對於Handler的攔截器===》處理器攔截器
03.核心控制器中的HandleMapping返回的就是一個
處理器執行鏈 = Handler+ Interceptors(處理器攔截器)
*/
public class MyInterceptor implements HandlerInterceptor{

/**
*
* @param request
* @param response
* @param handler 打印出來com.mmm.controller.UserController@6225177c
* @return
* @throws Exception
*
*
* HandlerInterceptor介面中的三個方法:
01.preHandle 如果返回值是false,則不會執行後續的操作! 一個攔截器
preHandle如果返回值是true 則會執行下一個攔截器。。
02.如果有多個攔截器,則之後攔截器中的所有方法都不會執行!
*/
@Override
public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception {
System.out.println("執行了 攔截器1111中的 ===》preHandle");

return true;
}

/**
* 之後指定了對應Handler中的方法之後 才執行!
* @param modelAndView 打印出來 ModelAndView: reference to view with name 'success'; model is {welcome=恭喜您登入成功}
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request,Object handler,ModelAndView modelAndView) throws Exception {
System.out.println("執行了 攔截器1111中的===》postHandle");

}

/**
* 只要是當前攔截器中的preHandle返回true則此方法必須執行!
* @param handler 打印出來com.mmm.controller.UserController@6225177c
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request,Exception ex) throws Exception {
System.out.println("執行了 攔截器1111的 ===》afterCompletion");
}
}

上述程式碼中,自定義攔截器實現了HandlerInterceptor介面,並實現了介面中的三個方法:

preHandle() 方法:該方法會在控制器方法前執行,其返回值表示是否中斷後續操作。當其返回值為true時,表示繼續向下執行;
當其返回值為false時,會中斷後續的所有操作(包括呼叫下一個攔截器和控制器類中的方法執行等)。

postHandle()方法:該方法會在控制器方法呼叫之後,且解析檢視之前執行。可以通過此方法對請求域中的模型和檢視做出進一步的修改。

afterCompletion()方法:該方法會在整個請求完成,即檢視渲染結束之後執行。可以通過此方法實現一些資源清理、記錄日誌資訊等工作。

1.2 攔截器的配置

開發攔截器就像開發servlet或者filter一樣,都需要在配置檔案進行配置,配置程式碼如下:

<!--配置自定義的攔截器-->
<mvc:interceptors>
<!--攔截器1-->
<mvc:interceptor>
<!--配置攔截器的作用路徑-->
<mvc:mapping path= "/user/**"/><!--攔截的路徑規則-->
<!--定義在<mvc:interceptor>下面的表示匹配指定路徑的請求才進行攔截-->
<bean/>
</mvc:interceptor>
<!--攔截器2-->
<mvc:interceptor>
<mvc:mapping path="/user/**"/><!--攔截的路徑規則-->
<bean/>
</mvc:interceptor>

</mvc:interceptors>

上面的程式碼中,<mvc:interceptors>元素用於配置一組攔截器,基子元素<bean>中定義的是全域性攔截器,它會攔截所有的請求;而<mvc:interceptor>元素中定義的是指定路徑的攔截器,它會對指定路徑下的請求生效。<mvc:interceptor>元素的子元素<mvc:mapping>用於配置攔截器作用的路徑,該路徑在其屬性path 中定義。如上述程式碼中 path 的屬性值“/**” 表示攔截所有路徑,“/hello” 表示攔截所有以 “/hello” 結尾的路徑。如果在請求路徑中包含不需要攔截的內容,還可以通過<mvc:exclude-mapping>元素進行配置。
注意:<mvc:interceptor>中的子元素必須按照上述程式碼中的配置順序進行編寫,即<mvc:mapping> <mvc:exclude-mapping> <bean>,否則檔案會報錯。

2. 攔截器的執行流程

1.程式先執行preHandle()方法,如果該方法的返回值為true,則程式會繼續向下執行處理器中的方法,否則將不再向下執行。

2.在業務處理器(即控制器Controller類)處理完請求後,會執行postHandle()方法,然後會通過DispatcherServlet向客戶端返回響應。

3.在DispatcherServlet處理完請求後,才會執行afterCompletion()方法。

進入了 login
執行了 攔截器1111中的 ===》preHandle
執行了 攔截器2222中的 ===》preHandle
進入了 main
執行了 攔截器2222中的===》postHandle
執行了 攔截器1111中的===》postHandle
執行了 攔截器2222的 ===》afterCompletion
執行了 攔截器1111的 ===》afterCompletion

到此這篇關於Spring MVC 攔截器 interceptor 用法詳解的文章就介紹到這了,更多相關Spring MVC 攔截器 interceptor 內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!