大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

SpringMVC教程
SpringMVC注解式開(kāi)發(fā)
SpringMVC核心技術(shù)
SSM整合開(kāi)發(fā)

SpringMVC攔截器

SpringMVC 中的 Interceptor 攔截器是非常重要和相當(dāng)有用的,它的主要作用是攔截指定的用戶請(qǐng)求,并進(jìn)行相應(yīng)的預(yù)處理與后處理。其攔截的時(shí)間點(diǎn)在“處理器映射器根據(jù)用戶提交的請(qǐng)求映射出了所要執(zhí)行的處理器類,并且也找到了要執(zhí)行該處理器類的處理器適配器,在處理器適配器執(zhí)行處理器之前”。當(dāng)然,在處理器映射器映射出所要執(zhí)行的處理器類時(shí),已經(jīng)將攔截器與處理器組合為了一個(gè)處理器執(zhí)行鏈,并返回給了中央調(diào)度器。

一個(gè)攔截器的執(zhí)行

項(xiàng)目:interceptor。

自定義攔截器

自定義攔截器,需要實(shí)現(xiàn) HandlerInterceptor 接口。而該接口中含有三個(gè)方法:

● preHandle(request, response, Object handler):

該方法在處理器方法執(zhí)行之前執(zhí)行。其返回值為 boolean,若為 true,則緊接著會(huì)執(zhí)行處理器方法,且會(huì)將 afterCompletion()方法放入到一個(gè)專門的方法棧中等待執(zhí)行。

● postHandle(request, response, Object handler, modelAndView):

該方法在處理器方法執(zhí)行之后執(zhí)行。處理器方法若最終未被執(zhí)行,則該方法不會(huì)執(zhí)行。

由于該方法是在處理器方法執(zhí)行完后執(zhí)行,且該方法參數(shù)中包含 ModelAndView,所以該方法可以修改處理器方法的處理結(jié)果數(shù)據(jù),且可以修改跳轉(zhuǎn)方向。

● afterCompletion(request, response, Object handler, Exception ex):

當(dāng) preHandle()方法返回 true 時(shí),會(huì)將該方法放到專門的方法棧中,等到對(duì)請(qǐng)求進(jìn)行響應(yīng)的所有工作完成之后才執(zhí)行該方法。即該方法是在中央調(diào)度器渲染(數(shù)據(jù)填充)了響應(yīng)頁(yè)面之后執(zhí)行的,此時(shí)對(duì) ModelAndView 再操作也對(duì)響應(yīng)無(wú)濟(jì)于事。

攔截器中方法與處理器方法的執(zhí)行順序如下圖:

換一種一表現(xiàn)方式,也可以這樣理解:

1、注冊(cè)攔截器

用于指定當(dāng)前所注冊(cè)的攔截器可以攔截的請(qǐng)求路徑,而/**表示攔截所 有請(qǐng)求。

2、修改 index 頁(yè)面

3、修改處理器

4、修改 show 頁(yè)面

5、控制臺(tái)輸出結(jié)果

多個(gè)攔截器的執(zhí)行

項(xiàng)目:interceptor2。在項(xiàng)目 interceptor 基礎(chǔ)上修改。

1、再定義一個(gè)攔截器

2、多個(gè)攔截器的注冊(cè)與執(zhí)行

3、控制臺(tái)執(zhí)行結(jié)果

當(dāng)有多個(gè)攔截器時(shí),形成攔截器鏈。攔截器鏈的執(zhí)行順序,與其注冊(cè)順序一致。需要再次強(qiáng)調(diào)一點(diǎn)的是,當(dāng)某一個(gè)攔截器的 preHandle()方法返回 true 并被執(zhí)行到時(shí),會(huì)向一個(gè)專門的方法棧中放入該攔截器的 afterCompletion()方法。

多個(gè)攔截器中方法與處理器方法的執(zhí)行順序如下圖:

將處理器執(zhí)行鏈返回給中央控制器

從圖中可以看出,只要有一個(gè) preHandle()方法返回 false,則上部的執(zhí)行鏈將被斷開(kāi), 其后續(xù)的處理器方法與 postHandle()方法將無(wú)法執(zhí)行。但,無(wú)論執(zhí)行鏈執(zhí)行情況怎樣,只要方法棧中有方法,即執(zhí)行鏈中只要有 preHandle()方法返回 true,就會(huì)執(zhí)行方法棧中的afterCompletion()方法。最終都會(huì)給出響應(yīng)。

換一種一表現(xiàn)方式,也可以這樣理解:

4、 閱讀源碼

查看中央調(diào)度器 DispatcherServlet 的 doDispatch()方法源碼:在執(zhí)行處理器方法之前, 會(huì)執(zhí)行處理器執(zhí)行鏈對(duì)象 mappedHandler 的 applyPreHandle()方法。然后執(zhí)行 Handler,最后 執(zhí)行處理器執(zhí)行鏈對(duì)象的 applyPostHandle()方法。

applyPreHandle()方法用于執(zhí)行處理器執(zhí)行鏈中的所有攔截器的 preHandle()方法。

applyPreHandle()方法的返回結(jié)果取決于執(zhí)行鏈中的每一個(gè)攔截器的 preHandle()方法。只要 有一個(gè) preHandle()方法返回 false,則其就會(huì)返回 false。然后就執(zhí)行了 return;即結(jié)束了 doDispatch()方法,即該請(qǐng)求的處理結(jié)束。

對(duì)于處理器執(zhí)行鏈的 applyPostHandle()方法,其是循環(huán)倒序執(zhí)行所有攔截器的 postHandle()方法的。

那么 afterCompletion()方法是什么時(shí)候執(zhí)行的呢?

在剛才的處理器執(zhí)行鏈的 applyPreHandle()方法中看到,若存在任一個(gè)攔截器的 preHandle()方法返回 false,則會(huì)調(diào)用執(zhí)行處理器執(zhí)行鏈的 triggerAfterCompletion()方法,即 會(huì)觸發(fā)所有 afterCompletion()方法的執(zhí)行。

在 doDispatch()方法中也存在一個(gè) catch(){}語(yǔ)句,表示若發(fā)生異常,則會(huì)調(diào)用執(zhí)行 triggerAfterCompletion()方法。

但在正常情況下,即所有的 preHandle()方法返回均為 true,且 doDispatch()方法沒(méi)有異 常發(fā)生的情況下,afterCompletion()方法是在視圖解析器后執(zhí)行的。

查看中央調(diào)度器 DispatcherServlet 的 processDispatchResult()方法源碼可知,在對(duì)視圖渲 染過(guò)后,會(huì)調(diào)用執(zhí)行處理器執(zhí)行鏈的 triggerAfterCompletion() 方法,即執(zhí)行所有的 afterCompletion()方法。

打 開(kāi) 處 理 器執(zhí) 行 鏈的 triggerAfterCompletion() 方法 , 可 以 看到 , 其對(duì)攔 截 器 的 afterCompletion()方法的執(zhí)行,也是循環(huán)倒序執(zhí)行的。

權(quán)限攔截器舉例

只有經(jīng)過(guò)登錄的用戶方可訪問(wèn)處理器,否則,將返回“無(wú)權(quán)訪問(wèn)”提示。

本例的登錄,由一個(gè) JSP 頁(yè)面完成。即在該頁(yè)面里將用戶信息放入 session 中。也就是說(shuō),只要訪問(wèn)過(guò)該頁(yè)面,就說(shuō)明登錄了。沒(méi)訪問(wèn)過(guò),則為未登錄用戶。

項(xiàng)目:interceptor_permission。在項(xiàng)目 interceptor1 基礎(chǔ)上修改。

1、修改 index 頁(yè)面

2、定義 Controller

3、定義 welcome 頁(yè)面

4、定義權(quán)限攔截器

當(dāng) preHandle()方法返回 false 時(shí),需要使用 request 或 response 對(duì)請(qǐng)求進(jìn)行響應(yīng)。

5、定義 fail 頁(yè)面

6、注冊(cè)權(quán)限攔截器

7、定義 login 頁(yè)面

8、定義 logout 頁(yè)面

9、項(xiàng)目測(cè)試

Step1:在地址欄先直接提交 system.do 請(qǐng)求

Step2:訪問(wèn) login.jsp,進(jìn)行用戶登錄

Step3:再次提交 system.do 請(qǐng)求

Step4:訪問(wèn) logout.jsp,進(jìn)行用戶退出

Step5:三次提交 system.do 請(qǐng)求

全部教程
主站蜘蛛池模板: 欧美色视频日本片免费高清 | 手机看片一区 | 国产精品免费观看 | www成人网 | 九九综合九九综合 | 国产精品a人片在线观看 | 狠狠色噜噜狠狠米奇777 | 亚洲成a人一区二区三区 | 青青久久久 | 亚洲精品国产精品国自产观看 | 99er久久 | 国产一区二区不卡视频 | 国产精品日本一区二区在线看 | 久久精品亚洲欧美日韩久久 | 亚洲一区二区观看 | 亚洲va久久久噜噜噜久久男同 | 插吧插吧综合网 | 激情在线日韩视频免费 | 成人免费一区二区三区在线观看 | 国产大片在线观看 | 欧美色欧美亚洲高清在线观看 | 精品国产品香蕉在线观看75 | 欧美成人aa大片拍拍拍 | 神马午夜不卡影院 | 麻豆国产高清精品国在线 | 色狠狠一区 | 黄色在线视频网站 | 国产成人精品日本亚洲语音2 | 久久er这里只有精品 | 婷婷的五月 | 香蕉久久网站 | 国产在线精品福利大全 | 天天综合天天添夜夜添狠狠添 | 久久国产乱子伦精品免费看 | 最新国产区 | 九九精品视频在线免费观看 | 四虎精品影院 | 96国产xxxx| 女人18毛片一级毛片在线 | 精品日产一区二区 | 国产福利91精品一区二区 |