什么时候用过滤器,什么时候使用拦截器。

以下引用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

原文地址:https://www.cnblogs.com/alilcu/p/8073744.html