zoukankan      html  css  js  c++  java
  • 记录一下filter

    filter是什么,如它的字面意思,就是拦截器。它可以在request到达相关资源之前,比如servlet之前先处理requeset,也可以拦截或处理从某个资源比如servlet发出的response。

    接口Filter

    Filter是个接口,javax.servlet  Interface Filter

    里面就三个方法:

    生命周期

    init方法:

    filter在servlet容器(也就是服务器)启动的时候就会初始化,filter的init方法只会在容器实例化一个filter的时候调用一次,只调用一次,这个方法用于初始化filter。

     FilterConfig是servlet容器传进init方法中的。

    doFilter方法:

    当Servlet每次处理Filter相关资源时,都会调用该Filter实例是doFilter方法,这个方法的参数有ServletRequest、ServletResponse、FilterChain三个。

    在Filter的实现中,doFilter一定要调用FilterChain的doFilter方法!

    一个资源可以被多个Filter关联到,一般我们叫这是Filter链条,这时我们的FilterChain的doFilter会触发Filter链条中的下一个Filter。只有在Filter链条中的最后一个Filter调用FilterChain.doFilter()方法,才会触发处理资源的方法(servlet中的service什么的)。

    注意,FilterChain中的doFilter是和Filter中的doFilter不一样的,前者只有两个参数,后者有三个参数。

     

    如果在Filter的实现中,没有调用这个chain的doFilter方法,那么对该request的处理就会终止。

    destroy方法:

    这个方法在Servlet容器要销毁Filter时触发,一般在应用停止时进行调用。

    这里讲一下关于Filter处理response和request:

    request来时,会先走每个filter中chain.doFilter方法之前的方法。然后走到chain.doFilter的时候,就走chain中其他filter,一样这样走。

    当所有的filter的chain.doFilter方法前的内容都调用完以后,才会调用servlet的service方法。
    service方法调用结束后会返回上一次的chain.doFilter方法,并执行doFilter方法后面的代码。接着,返回上上一个chain.doFilter方法……
    因此,我们的Filter都是在chain.doFilter方法调用之前来处理request请求,在chain.doFilter方法调用之后处理response响应。

    (图片转自博客:https://www.cnblogs.com/wuchaodzxx/p/6063530.html)

    Filter的执行顺序

     只有在部署描述符中,也就是web.xml中才能自定义filter的触发顺序,在web.xml中,哪个filter放在前面,就哪个先触发。

    如果是用注解来配置的filter,那么它的触发顺序是根据Filter的类型字符排序,比如如果两个Filtrer类,一个是Filter0,一个是Filter1,那么这个Filter0就先于Filter1进行拦截……

  • 相关阅读:
    Android的startActivityForResult()与onActivityResult()与setResult()参数分析,activity带参数的返回
    git stash 保存当前工作状态
    vim diff 的使用
    git pull 命令
    java 开发环境安装
    vim 处理换行符
    git 操作分支
    git 操作远程仓库地址
    vim 宏的使用
    Chrome 调试技巧
  • 原文地址:https://www.cnblogs.com/wangshen31/p/8809491.html
Copyright © 2011-2022 走看看