什么是过滤器
过滤器是一个运行在服务器端的程序,先于与之相关的Servlet或JSP页面之前运行,实现对请求资源的过滤的功能。其基本功能是对Servlet容器调用Servlet的过程行进拦截,从而在执行Servlet前后实现一些特殊的功能。
Filter生命周期及其与生命周期相关的方法
1)Filter对象的生命周期:
Filter何时创建:服务器启动时就创建该filter对象
Filter何时销毁:服务器关闭时filter销毁
2)生命周期相关的方法
init(Filterconfig config):代表filter对象初始化方法 filter 对象创建时执行
其中参数config代表 该Filter对象的配置信息的对象,内部封装是该filter的配置信息。
doFilter(ServletRequest,ServletResponse,FilterCha):代表filter执行过滤的核心方法,如果某资源在已经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法
其中的参数:
ServletRequest/ServletResponse:每次在执行doFilter方法时 web容器负责创建一个request和一个response对象作为doFilter的参数传递进来。该request和该response就是在访问目标资源的servlet方法时的request和response。
FilterChain:过滤器链对象,通过该对象的doFilter方法可以放行该请求
destory():代表是filter销毁方法,当filter对象销毁时执行该方法
Filter的访问流程:
过滤器的简单实现
步骤:
1)编写一个过滤器的类实现Filter接口
2)实现接口中尚未实现的方法(着重实现doFilter方法)
3)在web.xml中进行配置(主要是配置要对哪些资源进行过滤)
Filter的配置
Filter与Listener、Servlet一样,需要设置配置文件
url-pattern配置,类似Servlet配置
1)完全匹配 /sertvle
2)目录匹配 /aaa/bbb/*
/user/*:访问前台的资源进入此过滤器
/admin/*:访问后台的资源时执行此过滤器
3)扩展名匹配 *.abc *.jsp
注意:url-pattern可以使用servlet-name替代,也可以混用
dispatcher:访问的方式(了解)
REQUEST:默认值,代表直接访问某个资源时执行filter
FORWARD:转发时才执行filter
INCLUDE: 包含资源时执行filter
ERROR:发生错误时 进行跳转是执行filter
案例一:自动登录
在完成登录时,如果用户勾选“自动登陆”,将在下次登录时,自动完成的登录功能,减少用户再次输入账号和密码繁琐的操作,对用户的操作体验进行优化
login.jsp部分代码:
index.jsp部分代码:
LoginServlet
调用Service层和dao层查询该用户是否存在
PS:调用数据库代码和BDUtils就不写出来了,前面写得太多,具体操作都一个样
AutoLoginFilter
Filter配置设置
案例二:解决全局编码
编写Request装饰者实现类,理论需要实现HttpServletRequest接口,然后提供成员变量和构造方法,对接口中所有方法进行处理(增强或不增强),但HttpServletRequest 接口中方法过多,使操作虽然简单,但比较繁琐。javaEE 规范提供了HttpServletRequest 接口得装饰者实现基类HttpServletRequestWrapper,及按照装饰者编写实现类,所有方法都不增强。我们如果需要对方法进行增强,只需要继承该类,然后复写对应方法即可。
PS:需要访问的资源涉及编码问题,可以配置该 filter。另外,该filter还不够完善,只重写了 getParameter(name) 方法,还需要重写 request.getParameterMap();request.getParameterValues(name) 等方法。