过滤器与拦截器的爱恨情仇
先说一下吧,希望看到这篇文字的时候,你是后端实习生!我是干了这么多年才发现,过滤器和拦截器有相似之处还有偌大的异处,实在是惭愧惭愧,此时已狠狠睡了一觉泪流一地啊!
常用的框架Spring+Struts+Hibernate、SpringMVC+MyBatis,当然还有其他的,现在我只说这两个,我也只接触这两个。
来自Struts2拦截器,英文:interceptor,他真的类似于Filter。拦截器本身是一种AOP面向切面的编程思想,所以这和SpringAOP是同一种编程思想而已,在功能上也就是类似的。基于Struts拦截的需要继承ActionSupport并在struts.xml中配置一下。并且struts2中内置了一些拦截器,当然也可以继承AbstractIntercepter自定义拦截器。
Spring里也是有拦截器的,网上好多人说SpringAOP模块实现拦截,到也没错,只不过Spring里的拦截分:方法前拦截器(MethodBeforeAdvise接口)、返回后拦截器(AfterReturningAdvise接口)、异常捕获拦截器(ThrowAdvise接口)并且在需要时候,在ApplicationContext.xml里配置即可。
过滤器,英文:Filter,是Servlet的属性,他是要配置在web.xml中的,通过</filter>,</filter-mapping>,里面还有<url-pattern/> 等等。
那spring的过滤器呢?不严谨的说spring有过滤器,因为spring整合了servlet,实际上用的还是servlet的过滤器。也就是说,无论SSH或SSM都可以在web.xml里配置<filter>过滤器。常常听到的struts的过滤器,其实也是需要在web.xml中配置的还是使用<filter>实现。
拦截器和过滤器的最大不同则在于:
使用范围的不同(Filter只能用于Web程序另者均可)/阻拦规则不同(Servlet规则另者Spring框架支持)/阻止资源不同(Spring管理一切组件可以灵活拦截配置注入,前者不行)/阻止程度不同(前者只能事前,而Intecepter任何时机)
所以说使用SSH/SSM可以只有这3种方式实行拦截
1:使用<filter>
2:使用webwork的interceptor,
3:将action(controller)交给spring管理,并使用spring的Aop机制
而在Spring框架等MVC框架支持下,注入异常拦截,验证拦截相关的注解,BaseController,自定义注解,设置切点/面也最终回归到上述3种方法。
他们的爱恨情仇我知道的就这些,实际上他们的事而可不止这些,欢迎大家爆料~