摘要:下面的例子展示了怎樣配置一個攔截器使用攔截請求的處理方法映射機制包括處理方法攔截器,這在你需要為指定請求應(yīng)用特定功能時很有用,比如什么意思位于處理方法映射中的攔截器必須實現(xiàn)包中的接口。
??這一部分的例子見這個項目的 mvc 分支下的 TimeBasedAccessInterceptor.java
??Spring 在之前的版本中,用戶要在 Web 應(yīng)用程序上下文中定義一個或多個 HandlerMapping Bean 用于把進來的 Web 請求映射到合適的處理方法。在引進注解控制器之后,你通常不需要這么做,因為 RequestMappingHandlerMapping 自動在所有控制器中尋找 @RequestMapping 注解。但是要記住,所有繼承自 AbstractHandlerMapping 的 HandlerMapping 類有下面的屬性,你可以用它們來自定義行為:
interceptors——攔截器使用的列表。有關(guān) HandlerInterceptors 的討論在“使用 HandlerInterceptor 攔截請求”
defaultHandler——在處理方法映射沒有找到匹配時使用的缺省處理方法
order——基于 order 屬性值(見接口 org.springframework.core.Ordered ),Spring 對上下文中可用的處理方法映射進行排序,并應(yīng)用第一個匹配。
alwaysUseFullPath——如果是 true,在當(dāng)前 Servlet 上下文中 Spring 使用全路徑來尋找合適的處理方法。如果是 false(缺省值),就使用當(dāng)前 Servlet 映射中的路徑。例如,如果一個 Servlet 映射使用“/testing/*”同時 alwaysUseFullPath 屬性為 true,那么就使用“/testing/viewPage.html”;如果是 false,就使用“/viewPage.html”
urlDecode——從 Spring 2.5 開始,缺省值為 true。如果你喜歡比較被編碼的路徑,就把這個標(biāo)記設(shè)置為 false 吧。然而,HttpServletRequest 一直都是用編碼后的形式來暴露 Servlet 路徑。注意,在比較被編碼的路徑時,Servlet 路徑不會匹配。
??下面的例子展示了怎樣配置一個攔截器:
使用 HandlerInterceptor 攔截請求
??Spring 的處理方法映射機制包括處理方法攔截器,這在你需要為指定請求應(yīng)用特定功能時很有用,比如 checking for a principal(什么意思?)
??位于處理方法映射中的攔截器必須實現(xiàn) org.springframework.web.servlet 包中的
HandlerInterceptor 接口。這個接口定義了三個方法:
preHandle(..) ????在處理方法執(zhí)行前調(diào)用;
postHandle(..)????在處理方法執(zhí)行后調(diào)用;
afterCompletion(..)??在完成請求結(jié)束后調(diào)用。
這三個方法為預(yù)處理和后處理提供了足夠的靈活性。
??方法 preHandle(..) 返回一個布爾值。你可以使用這個方法來中斷或者繼續(xù)執(zhí)行鏈的處理。這個方法返回 true 時,處理方法的執(zhí)行鏈會繼續(xù);返回 false 時,DispatcherServlet 就嘉定攔截器自己已經(jīng)處理好了請求(比如渲染一個適當(dāng)?shù)囊晥D),并不再繼續(xù)執(zhí)行其他攔截器和實際存在于執(zhí)行鏈的中的處理方法。
??攔截器可以使用 interceptors 屬性來配置,這適用于所有繼承自 AbstractHandlerMapping 的 HandlerMapping 類。下面是一個例子:
package samples; public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter { private int openingTime; private int closingTime; public void setOpeningTime(int openingTime) { this.openingTime = openingTime; } public void setClosingTime(int closingTime) { this.closingTime = closingTime; } public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Calendar cal = Calendar.getInstance(); int hour = cal.get(HOUR_OF_DAY); if (openingTime <= hour && hour < closingTime) return true; response.sendRedirect("http://host.com/outsideOfficeHours.html"); return false; } }
??任何被這個映射處理的請求都會被 TimeBasedAccessInterceptor 攔截。如果當(dāng)前時間不是上班時間,用戶就被重定向到一個靜態(tài) HTML 頁面中去,這個頁面告訴用戶,比如,你只能在上班時間訪問網(wǎng)站。
??在使用 RequestMappingHandlerMapping 的時候,實際的處理方法是一個 HandlerMethod 實例,它識別要被調(diào)用的指定的控制器方法。
??就像你看到的那樣,Spring 的適配器類 HandlerInterceptorAdapter 使擴展接口 HandlerInterceptor 變得更加容易。
??在上面的例子中,配置的攔截器會應(yīng)用于所有被注解的控制器方法處理的請求。你想窄化攔截器攔截的 URL 路徑,你可以使用 MVC 命名空間或者 MVC Java 配置,或者聲明一個 MappedInterceptor 類型的 Bean 實例來這么做。詳見“啟用 MVC Java 配置或者 MVC XML 命名空間配置”
??注意,接口 HandlerInterceptor 的 postHandle 方法并不總是完美的適用于使用 @ResponseBody 和 ResponseEntity 的方法。在這種情況下,在 postHandle 方法調(diào)用之前,HttpMessageConverter 已經(jīng)寫并且提交了響應(yīng),這樣就不再能夠改變響應(yīng)了,比如添加響應(yīng)頭。替代方案是,應(yīng)用程序可以實現(xiàn) ResponseBodyAdvice 接口,同時要么聲明它為一個 @ControllerAdvice Bean,要么直接把它配置在 RequestMappingHandlerAdapter上。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/66079.html
摘要:默認(rèn)支持該策略。以上是對的宏觀分析,下面我們進行內(nèi)部細(xì)節(jié)分析。整體流程一通過實現(xiàn)接口,完成攔截器相關(guān)組件的初始化調(diào)用類的方法。總結(jié)本文主要分析了的初始化過程,希望對大家有幫助。隨著學(xué)習(xí)的深入,后面有時間在分析下期中涉及的關(guān)鍵,比如等等。 概述 本節(jié)我們繼續(xù)分析HandlerMapping另一個實現(xiàn)類ReqeustMappingHandlerMapping,該類是我們?nèi)粘i_發(fā)中使用最多的...
摘要:由于抽象類重寫了父類的方法,所以此時會調(diào)用的方法,在該方法中通過調(diào)用父類的方法,該方法通過模板方法模式最終調(diào)到類的方法。分析該類間接實現(xiàn)了接口,直接實現(xiàn)該接口的是抽象類,映射與請求。 概述 在前一章https://segmentfault.com/a/1190000014901736的基礎(chǔ)上繼續(xù)分析,主要完成SimpleUrlHandlerMapping類的原理。 本系列文章是基于Sp...
摘要:本文主要分析的是庫的這個模塊中的代碼。將結(jié)果轉(zhuǎn)換成一個迭代器。函數(shù)函數(shù)的定義如下位置位置位置該函數(shù)的參數(shù)中就是,是路由映射表則是,是本次請求路徑。位置,如果是其他情況,比如直接指定一個類對象作為處理對象。 本文主要分析的是web.py庫的application.py這個模塊中的代碼??偟膩碚f,這個模塊主要實現(xiàn)了WSGI兼容的接口,以便應(yīng)用程序能夠被WSGI應(yīng)用服務(wù)器調(diào)用。WSGI是We...
摘要:接口接口作用是將請求映射到處理程序,以及預(yù)處理和處理后的攔截器列表,映射是基于一些標(biāo)準(zhǔn)的,其中的細(xì)節(jié)因不同的實現(xiàn)而不相同。該參數(shù)是類型,作用是檢查所有的映射解析器或使用或為的,默認(rèn)為,即從上下文中檢查所有的。 概述 在Spring MVC啟動章節(jié)https://segmentfault.com/a/1190000014674239,介紹到了DispatcherServlet的onRef...
摘要:靜態(tài)資源處理啟動加載日志處理回顧初識過濾器監(jiān)聽器攔截器我們通過啟動日志,可以發(fā)現(xiàn),默認(rèn)提供了靜態(tài)資源處理。 Spring Boot - 靜態(tài)資源處理、啟動加載、日志處理 回顧 Spring Boot-初識 Hello World Spring Boot - Servlet、過濾器、監(jiān)聽器、攔截器 我們通過啟動日志,可以發(fā)現(xiàn),spring boot 默認(rèn)提供了靜態(tài)資源處理。接下來,我...
閱讀 1140·2021-11-24 10:21
閱讀 2576·2021-11-19 11:35
閱讀 1678·2019-08-30 15:55
閱讀 1307·2019-08-30 15:54
閱讀 1205·2019-08-30 15:53
閱讀 3519·2019-08-29 17:21
閱讀 3319·2019-08-29 16:12
閱讀 3428·2019-08-29 15:23