日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

StrutsPreparedAndExcuteFilter与Interceptor

發(fā)布時(shí)間:2024/8/26 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 StrutsPreparedAndExcuteFilter与Interceptor 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

filter詳解

Filter種類(servlet預(yù)處理)

  • 用戶授權(quán)的Filter:Filter負(fù)責(zé)檢查用戶請求,對用戶訪問權(quán)限的控制
  • 日志Filter:詳細(xì)記錄某些特殊的用戶請求。
  • 負(fù)責(zé)解碼的Filter:包括對非標(biāo)準(zhǔn)編碼的請求解碼。
  • Filter可負(fù)責(zé)攔截多個(gè)請求或響應(yīng);一個(gè)請求或響應(yīng)也可被多個(gè)請求攔截

filter的常用方法與生命周期

? ? ? ? ? ? void destory()

? ? ? ? ? ? void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)

? ? ? ? ? ? void init(FilterConfig filterConfig)

所有的filters會形成一個(gè)FilerChain,web服務(wù)器根據(jù)filter在web.xml中的注冊順序,依次執(zhí)行dofilter方法(該方法會傳入FilterChain對象),每個(gè)filter的dofilter方法都會有chain.dofilter( , )這行代碼,產(chǎn)生的效果為:如果這不是最后一個(gè)filter,那么就向下繼續(xù)執(zhí)行下一個(gè)filter的dofilter方法,否則將請求發(fā)送到servlet中進(jìn)行響應(yīng)。httpservletResponse依次經(jīng)過filter相反的順序返回給瀏覽器。

filter在web.xml中的配置(以struts為例)

注:filter只會攔截符合url-pattern的請求模式屬于dispatcher標(biāo)簽的請求。

<filter><filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class><filter-mapping><filter-name>struts</filter-name><!-- 所有的url都會被url過濾器解析 --><url-pattern>/*</url-pattern> <!--forward表示只過濾內(nèi)部轉(zhuǎn)發(fā)的請求--><dispatcher>FORWARD</dispatcher> <!--request表示只過濾客戶端的請求--><dispatcher>REQUEST</dispatcher></filter-mapping>

?

filter與servlet關(guān)系

? ? ?filter可以認(rèn)為是Servlet的一種“加強(qiáng)版”,它主要用于對HttpServletRequest進(jìn)行預(yù)處理,也可以對HttpServletResponse進(jìn)行后處理,是個(gè)典型的處理鏈(filterChain)。但它不能對請求做出響應(yīng),這是與servlet的最大區(qū)別。

?StrutsPreparedAndExcutedFilter ??

? ? ?在該filer的init()方法中,會加載struts.properties文件和struts.xml等文件,在dofilter方法中,會創(chuàng)建一個(gè)ActionContext對象(該對象可以與servlet api進(jìn)行交互),并根據(jù)請求的action映射到實(shí)際資源,在struts中該filter和action充當(dāng)控制器的作用。

Interceptor(對比filter理解)

  • void init():在該攔截器被實(shí)例化之后,在該攔截器執(zhí)行攔截之前,系統(tǒng)將回調(diào)該方法。對于每個(gè)攔截器而言,其init()方法只執(zhí)行一次。因此,該方法的方法體主要用于初始化資源。
  • void destory():該方法與init()方法對應(yīng)。在攔截器實(shí)例被銷毀之前,系統(tǒng)將回調(diào)該攔截器的destory方法,該方法用于銷毀在init方法里打開的資源。
  • String intercept(ActionInvocation invocation):這個(gè)方法具備以下2層含義:
  • ActionInvocation是ActionProxy實(shí)例化的,封裝了關(guān)于action以及相關(guān)Interceptor的信息。
  • 如果攔截器堆棧中還有其他的Interceptor,那么invocation.invoke()將調(diào)用堆棧中下一個(gè)Interceptor的執(zhí)行。
  • 如果攔截器堆棧中只有Action了,那么invocation.invoke()將調(diào)用Action執(zhí)行。
  • 所以,我們可以發(fā)現(xiàn),invocation.invoke()這個(gè)方法其實(shí)是整個(gè)攔截器框架的實(shí)現(xiàn)核心。基于這樣的實(shí)現(xiàn)機(jī)制,我們還可以得到下面2個(gè)非常重要的推論:

  • 如果在攔截器中,我們不使用invocation.invoke()來完成堆棧中下一個(gè)元素的調(diào)用,而是直接返回一個(gè)字符串作為執(zhí)行結(jié)果,那么整個(gè)執(zhí)行將被中止。
  • 我們可以以invocation.invoke()為界,將攔截器中的代碼分成2個(gè)部分,在invocation.invoke()之前的代碼,將會在Action之前被依次執(zhí)行,而在invocation.invoke()之后的代碼,將會在Action之后被逆序執(zhí)行。
  • 由此,我們就可以通過invocation.invoke()作為Action代碼真正的攔截點(diǎn),從而實(shí)現(xiàn)AOP(切面編程)。

?

Interceptor和Filter區(qū)別與聯(lián)系

1.filter通過chain.dofilter()進(jìn)行函數(shù)回調(diào),而Interceptor是基于java反射的

2.filter存在于servlet容器中,Intercept不然獨(dú)立web容器

3.filter作用于servlet,即幾乎對所有請求都有過濾作用,而intercepor只對action請求起作用

4.在action的生命周期中,攔截器可以多次被調(diào)用,而過濾器只能在容器初始化時(shí)被調(diào)用一次

5.都是aop思想的實(shí)現(xiàn)

轉(zhuǎn)載于:https://www.cnblogs.com/kundeg/p/6534900.html

總結(jié)

以上是生活随笔為你收集整理的StrutsPreparedAndExcuteFilter与Interceptor的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。