filter详解

Filter种类(可以进行那些预处理)

  • 用户授权的Filter:Filter负责检查用户请求,对用户访问权限的控制
  • 日志Filter:详细记录某些特殊的用户请求。
  • 负责解码的Filter:包括对非标准编码的请求解码。
  • Filter可负责拦截多个请求或响应;一个请求或响应也可被多个请求拦截。

filter

三个方法:void destory()

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

void init(FilterConfig filterConfig)

所有的filters会形成一个FilerChain,web服务器根据filter在web.xml中的注册顺序,依次执行dofilter方法(该方法会传入FilterChain对象),每个filter的dofilter方法都会有chain.dofilter( , )这行代码,产生的效果为:如果这不是最后一个filter,那么就向下继续执行下一个filter的dofilter方法,否则将请求发送到servlet中进行响应。httpservletResponse依次经过filter相反的顺序返回给浏览器。

filter生命周期

与servlet基本相同

filter与servlet关系

filter可以认为是Servlet的一种“加强版”,它主要用于对HttpServletRequest进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链(filterChain)。但它不能对请求做出响应,这是与servlet的最大区别。

StrutsPreparedAndExcutedFilter   

     在该filer的init()方法中,会加载struts.properties文件和struts.xml等文件,在dofilter方法中,会创建一个ActionContext对象(该对象可以与servlet api进行交互),并根据请求的action映射到实际资源,在struts中该filter和action充当控制器的作用。

Interceptor(对比filter理解)

  • void init():在该拦截器被实例化之后,在该拦截器执行拦截之前,系统将回调该方法。对于每个拦截器而言,其init()方法只执行一次。因此,该方法的方法体主要用于初始化资源。
  • void destory():该方法与init()方法对应。在拦截器实例被销毁之前,系统将回调该拦截器的destory方法,该方法用于销毁在init方法里打开的资源。
  • String intercept(ActionInvocation invocation):这个方法具备以下2层含义:
    1. ActionInvocation是ActionProxy实例化的,封装了关于action以及相关Interceptor的信息。
    2. 如果拦截器堆栈中还有其他的Interceptor,那么invocation.invoke()将调用堆栈中下一个Interceptor的执行。
    3. 如果拦截器堆栈中只有Action了,那么invocation.invoke()将调用Action执行。

    所以,我们可以发现,invocation.invoke()这个方法其实是整个拦截器框架的实现核心。基于这样的实现机制,我们还可以得到下面2个非常重要的推论:

    1. 如果在拦截器中,我们不使用invocation.invoke()来完成堆栈中下一个元素的调用,而是直接返回一个字符串作为执行结果,那么整个执行将被中止。
    2. 我们可以以invocation.invoke()为界,将拦截器中的代码分成2个部分,在invocation.invoke()之前的代码,将会在Action之前被依次执行,而在invocation.invoke()之后的代码,将会在Action之后被逆序执行。

    由此,我们就可以通过invocation.invoke()作为Action代码真正的拦截点,从而实现AOP(切面编程)。

Interceptor和Filter区别

1.filter通过chain.dofilter()进行函数回调,而Interceptor是基于java反射的

2.filter存在于servlet容器中,Intercept不然独立web容器

3.filter作用于servlet,即几乎对所有请求都有过滤作用,而intercepor只对action请求起作用

4.在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

最新文章

  1. Windows 10下使用U盘安装Ubuntu双系统
  2. RapidJSON v1.1.0 发布简介
  3. Git 基础
  4. javascript--Object
  5. Maven的set.xml标签详解
  6. Apache日志轮替规则
  7. MyISAM 与 InnoDB 的区别
  8. Yahoo, Steve blog
  9. mq_unlink
  10. sqlserver之二进制和字符串sql语句
  11. easyui源码翻译1.32--EasyLoader(简单加载)
  12. 更换手机号或者更换手机后QQ设备锁的设置问题
  13. OpenCV 安装
  14. S全选功能代码
  15. CAPSPageMenu分页交互
  16. iReport折线图
  17. Android开发之Android Context Menu
  18. 支持Touch ID!EOS 项目进展速报
  19. Java四种线程池的学习与总结
  20. Spring Boot - AOP(面向切面)-切入点表达式

热门文章

  1. JVM-6.即时编译器
  2. 禅道---Bug管理模块
  3. ASP.NET MVC5(四):数据注解和验证
  4. 对象级别锁 vs 类级别锁 – Java
  5. h5之scrollIntoView控制页面元素滚动
  6. webpack前端工程化构建工具的使用
  7. tomcat运行war包报错,找不到context-root文件
  8. explode和implode的运用
  9. 在win7下如何设置计划任务每一分钟执行一次
  10. php中json对象数据的输出转化