spring java interceptor

Spring HandlerInterceptor攔截器

鄭筌唯 2016/11/15 13:53:36
3218







主題

Spring HandlerInterceptor攔截器

文章簡介

介紹Spring中的攔截器 HandlerInterceptor,透過簡單的範例,初步了解HandlerInterceptor

作者

鄭筌唯

版本/產出日期

V1.0/2016.10.30




1. 前言

2. 目的

3. 本文

4. 參考來源





1. 前言

Interceptor在開發中是常用到的功能,可用在紀錄Log、預先設置數據及驗證相關數據等。Spring的攔截器分兩種:HandlerInterceptor和MethodInterceptor,本篇主要介紹HandlerInterceptor如何配置及使用。


2. 目的

透過簡單的範例,瞭解HandlerInterceptor。


3. 本文

HandlerInterceptor是屬於Spring MVC的攔截器,主要攔截來自於web的request。

首先建立一個Interceptor的Class,並且extends org.springframework.web.servlet.handler.HandlerInterceptorAdapter,

31extends HandlerInterceptorAdapter


或是直接implements org.springframework.web.servlet.HandlerInterceptor,並Override其 method,

32implements HandlerInterceptor


接著在mvc-config.xml檔進行配置,可簡單進行全域的配置。

33xml單一全域配置


也可以同時設置多個全域的攔截器。

34xml檔多全域配置


或是針對選擇的路徑進行攔截。

35xml依路徑配置單一攔截器

<mvc:interceptor>:用於註冊一個自定義的攔截器或是WebRequestIntereptors,可以經由設定的

                 URL路徑攔截傳入的request,自定義的攔截器需實作Handlerinterceptor。

<mvc:mapping path=”/”>:用於設定URL路徑,「/」是web的根目錄,「/*」是所有文件夾,不

                        含子文件夾,「/**」是所有文件夾及裡面的子文件夾。

<beans:property name=”start”>:配合<beans:value>設置屬性值,spring使用xml解析數據,利

                             用java.beans.PropertyEdior完成類型轉換。需使用getter及

Setter來皆預設值。

36xml預設屬性值


也可以針對不同路徑使用不同的攔截器。

37xml檔依路徑配置多個攔截器


若不使用<mvc:interceptors>,也可直接在HandelrMapping內進行配置。

38HandelrMapping內進行配置


設定檔設定完成後,extends HandlerInterceptorAdapter或implements HandlerInterceptor的Class皆有三種方法可以使用:preHandle、postHandle和afterCompletion

39HandlerInterceptior的三種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設定全域配置


315preHandle( )存入開始時間,並在網頁開啟後呼叫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

鄭筌唯