Spring HandlerInterceptor攔截器
主題: |
Spring HandlerInterceptor攔截器 |
文章簡介: |
介紹Spring中的攔截器 HandlerInterceptor,透過簡單的範例,初步了解HandlerInterceptor。 |
作者: |
鄭筌唯 |
版本/產出日期: |
V1.0/2016.10.30 |
1. 前言
• Interceptor在開發中是常用到的功能,可用在紀錄Log、預先設置數據及驗證相關數據等。Spring的攔截器分兩種:HandlerInterceptor和MethodInterceptor,本篇主要介紹HandlerInterceptor如何配置及使用。
2. 目的
• 透過簡單的範例,瞭解HandlerInterceptor。
3. 本文
HandlerInterceptor是屬於Spring MVC的攔截器,主要攔截來自於web的request。
首先建立一個Interceptor的Class,並且extends org.springframework.web.servlet.handler.HandlerInterceptorAdapter,
圖 31:extends HandlerInterceptorAdapter
或是直接implements org.springframework.web.servlet.HandlerInterceptor,並Override其 method,
圖 32:implements HandlerInterceptor
接著在mvc-config.xml檔進行配置,可簡單進行全域的配置。
圖 33:xml檔單一全域配置
也可以同時設置多個全域的攔截器。
圖 34:xml檔多個全域配置
或是針對選擇的路徑進行攔截。
圖 35:xml檔依路徑配置單一攔截器
<mvc:interceptor>:用於註冊一個自定義的攔截器或是WebRequestIntereptors,可以經由設定的
URL路徑攔截傳入的request,自定義的攔截器需實作Handlerinterceptor。
<mvc:mapping path=”/”>:用於設定URL路徑,「/」是web的根目錄,「/*」是所有文件夾,不
含子文件夾,「/**」是所有文件夾及裡面的子文件夾。
<beans:property name=”start”>:配合<beans:value>設置屬性值,spring使用xml解析數據,利
用java.beans.PropertyEdior完成類型轉換。需使用getter及
Setter來皆預設值。
圖 36:xml預設屬性值
也可以針對不同路徑使用不同的攔截器。
圖 37:xml檔依路徑配置多個攔截器
若不使用<mvc:interceptors>,也可直接在HandelrMapping內進行配置。
圖 38:在HandelrMapping內進行配置
設定檔設定完成後,extends HandlerInterceptorAdapter或implements HandlerInterceptor的Class皆有三種方法可以使用:preHandle、postHandle和afterCompletion
圖 39:HandlerInterceptior的三種method
preHandle( ):會在Controller執行前被呼叫,可預先執行編碼或安全控制等,回傳的boolean值
決定是否繼續執行,回傳”true”會繼續執行流程,回傳”false”會停止,後續的
Interceptor或Controller都不會執行。
postHandle( ):會在Controller執行後被呼叫,有機會修改ModelAndView。
afterCompletion( ):會在view繪製完成後被呼叫,可依據Exception來作處理,Exception從底
層向外拋出,最後到spring框架到這個method中。
方法執行順序如下圖。
圖 310:方法執行順序1
圖 311:方法執行順序2
同時設定多的Interceptor,其執行順序如下圖。
圖 312:設定多個Interceptor
圖 313:多個Interceptor執行結果
實作範例A:
對性能的測試,測試網頁呼叫到開啟所花費的時間,進行性能的改善。
作法為在進入Controller前,在preHandle( )紀錄開始時間,並在畫面開啟後,於afterCompetion( ),記錄結束時間,計算前後所花費的時間作為性能改善的依據。
圖 314:在config.xml設定全域配置
圖 315:在preHandle( )存入開始時間,並在網頁開啟後呼叫afterCompletion( )計算總花費時間
圖 316:性能測試結果
實作範例B:
HandlerInterceptor也可以做到類似filter的功能,透過簡單的設定,過濾所有的request。
此範例於config.xml設定網頁啟用及關閉時間,在preHandle( )中判斷是否符合網站開放時間。
圖 317:在config.xml設定Interceptor及預設網站開啟及關閉時間
圖 318:依照現在時間判斷網站是否開啟,達到類似filter的功能
圖 319:開始時間9時,結束時間22時,現在21時,可進入本網站
圖 320:開始時間9時,結束時間22時,現在23時,網站已關閉
4. 參考來源
• HandlerInterceptor (Spring Framework 4.3.3.RELEASE API)-http://docs.spring.io/spring/docs/current/javadoc- api/org/springframework/web/servlet/HandlerInterceptor.html
• Web MVC framework-http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-handlermapping-interceptor
• Handler Interceptor-
http://openhome.cc/Gossip/SpringGossip/HandlerInterceptor.html