什么時候用過濾器,什么時候使用攔截器。


以下引用http://www.cnblogs.com/dreamroute/p/4198087.html?utm_source=tuicool:

①攔截器是基於java的反射機制的,而過濾器是基於函數回調。
  ②攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
  ③攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
  ④攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
  ⑤在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。

  6.攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,可以調用業務邏輯。

另摘自http://blog.csdn.net/chenleixing/article/details/44573495#reply ,疑似《java編程思想》截圖

這本書對java開發者來說確實是奇書,雖然不管什么時候看都是似懂非懂,而且每次都沒看完。但確實有幫助,推薦1-2年開發者看

 

大家請看我的web.xml過濾器配置,依次 為shiro權限過濾器,編碼過濾器,微信接口過濾器,上傳文件過濾器

復制代碼
<!-- shiro過濾器定義 --> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <!-- 該值缺省為false,表示生命周期由SpringApplicationContext管理,設置為true則表示由ServletContainer管理 --> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 編碼過濾器 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!--<async-supported>true</async-supported>--> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--微信接口訪問--> <filter> <filter-name>WXInterface</filter-name> <filter-class>com.shangtu.filter.WXInterfaceFilter</filter-class> </filter> <filter-mapping> <filter-name>WXInterface</filter-name> <url-pattern>/WX/*</url-pattern><!-- 你開放的接口前綴 --> </filter-mapping> <!--上傳接口訪問--> <filter> <filter-name>UploadInterface</filter-name> <filter-class>com.shangtu.filter.FileUploadFilter</filter-class> </filter> <filter-mapping> <filter-name>UploadInterface</filter-name> <url-pattern>/upload/*</url-pattern><!-- 你開放的接口前綴 --> </filter-mapping>
復制代碼

然后很不幸的我的項目中沒有使用interceptor(第一次自己搭建項目,很多功能需求還在確認中),使用的是aspect,以下以日志記錄為例:

1、注冊bean,開啟aspect注解支持,開啟aspect注解掃描

View Code

2、建立自定義注解類,達到靈活注解的目的

View Code

3、寫入邏輯,日志為操作成功后記錄

View Code

至此,只要在controller方法中加入

@SyslogAnnotation(modelName="代理中心", functionName="給代理發卡", commons="userId:登錄ID,agentId:被發卡人ID,card:發卡數量")

即可獲取參數,插入自定義日志到數據庫中 。

而關於Aspect與interceptor的關系,大致百度了一下(不能不信,也不能全信,希望以后能在這方面繼續完善更新) 

AOP是一種將業務邏輯提取出來,以實現代碼復用,易於維護的方式,攔截器是它的一種具體實現,aspectJ也是一種具體實現,但攔截器具有代碼侵入性,aspectJ具有相比更低的侵入性,更好,易於維護

根據以上代碼事實可以確認的是,

1、大量的請求塊信息處理使用filter,  特別的內部邏輯處理所使用aspect

2、filter是servlet級別的,不屬於spring      aspect和interceptor屬於spring框架 

3、filter配置在web.xml中    interceptor配置在spring配置文件中 

4、filter的作用范圍中可以包含aspect和interceptor

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM