上一節(jié)小博老師給大家介紹了SpringMVC中使用HandlerInterceptor接口實(shí)現(xiàn)攔截器的方法,今天小博老師先給大家介紹另外一種攔截器的實(shí)現(xiàn)方式WebRequestInterceptor。我們先來(lái)看一下WebRequestInterceptor接口的源碼結(jié)構(gòu):
WebRequestInterceptor接口同HandlerInterceptor接口一樣定義了三個(gè)方法,preHandle 、postHandle 以及afterCompletion。兩個(gè)接口的方法名都相同,調(diào)用次序也相同。即preHandle是在請(qǐng)求處理之前調(diào)用;postHandle實(shí)在請(qǐng)求處理之后,視圖渲染之前調(diào)用;afterCompletion是在視圖渲染之后調(diào)用。接下來(lái)我們看看他們的不同之處。
1.方法參數(shù)不同。WebRequest是Spring定義的接口,它是對(duì)HttpServletRequest的封裝。對(duì)WebRequest 進(jìn)行的操作都將同步到HttpServletRequest 中。WebRequest 的set/getAttribute(name, value, scope)比HttpServletRequest 的set/getAttribute多了一個(gè)scope參數(shù)。它有三個(gè)取值:
SCOPE_REQUEST:它的值是0,表示request請(qǐng)求作用范圍。
SCOPE_SESSION :它的值是1,表示session請(qǐng)求作用范圍。
SCOPE_GLOBAL_SESSION :它的值是2 ,表示全局會(huì)話作用范圍,即ServletContext上下文作用范圍。
2.preHandle 方法。WebRequestInterceptor的該方法返回值為void,不是boolean。所以該方法不能用于請(qǐng)求阻斷,一般用于資源準(zhǔn)備。
3.postHandle 方法。preHandle 中準(zhǔn)備的數(shù)據(jù)都可以通過(guò)參數(shù)WebRequest訪問(wèn)。ModelMap 是Controller 處理之后返回的Model 對(duì)象,可以通過(guò)改變它的屬性來(lái)改變Model 對(duì)象模型,達(dá)到改變視圖渲染效果的目的。
4.afterCompletion方法。Exception 參數(shù)表示的是當(dāng)前請(qǐng)求的異常對(duì)象,如果Controller 拋出的異常已經(jīng)被處理過(guò),則Exception對(duì)象為null 。