Filter的生命周期
当Tomcat启动时,通过反射机制调用Filter的无参构造创建实例对象(结合配置文件),同时调用init方法实现初始化,doFilter方法调用多次,当Tomcat服务关闭的时候,调用destroy来销毁对象。
无参构造函数:只调用一次,当Tomcat启动时调用,(Filter一定要进行配置)
init方法:只调用一次,当Filter的实例化对象创建完成之后调用
doFilter:调用多次,方位Filter的业务逻辑都写在Filter中
destroy:只调用一次,Tomcat关闭时调用
同时配置多个Filter,Filter的调用顺序是由web.xml中的配置顺序来决定的,写在上面的配置先调用,因为web.xml是从上到下顺序读取的。
启动
当tomcat一启动,直接就调用构造函数和初始化函数,不是像servlet一样第一次访问的时候创建
doFilter函数每次都会进来
关闭服务,就执行destroy
每访问一次,就调用一次 doFilter,这里和servlet一样,每次去请求Filter的时候,就会调doFliter方法。
新建一个MyFilter
在web.xml里面配置myFilter是login,login可以和characfilter配起来,也可以和myFilter配起来,和servlet也能配起来
一个login请求对应三个资源,Filter的优先级高于servlet。先是CharacterFilter再是myfilter,再往后走就进到servlet
因为CharacterFilter的配置文件放在myFilter的前面,所以先进到characterfilter。
用注解的方式配置filter
也可以通过注解的方式简化web.xml的配置
把web.xml里面的代码注释,再用webFilter配置,但是注解的方式不能决定多个filter之间的优先顺序,是随机的
实际开发中Filter的使用场景:
1.统一处理中文乱码
2.屏蔽敏感词
3.控制资源的访问权限
最终跳到TestServlet,所以
往后传 放到servlet里面输出
发现是没有处理的 取出来了,原因是Filter是将请求里面的敏感词复制一份,改完输出,但是不能去修改后放回请求,请求里面的内容没有改就继续往下传了,两个资源之间跳转,可以用setAttribute去解决。存到Attribute里面,也用Atrribute去改
Parameter是浏览器给的,可以取但是放不回去
控制资源的访问权限
加个过滤器,在过滤器当中判断是否是登录状态,如果是登录,跳到download.jsp,如果不是,需要重新登录
过滤器要拦截/download请求
jsp是可以直接访问的,就在根目录下,servlet是间接访问,它是在WEB-INF里面
判断是否登录,转换成session里面是否存在用户信息