Filter称之为过滤器,是SerlvetAPI提供的一个Filter接口,A类实现了这个接口,那么A类称之为过滤器Filter。主要用户的请求(HttpServletRequest)进行预处理,也可以对服务器响应后的数据进行处理。也就是在请求到达服务器处理之前进行拦截,将过滤后符号条件的数据交给服务器进行处理生成响应,最后Filter再对服务器响应的数据进行处理。
下面以登录权限的验证为例子:用户在没有登录的情况下,是不允许查看html,jsp的界面等等。拦截器在请求到达服务器之前拦截浏览器的请求,如果用户已经登录就让其访问资源。没有登录就会跳转到登录界面需要登录。
在HttpServletRequest到达 Servlet 之前,拦截客户的HttpServletRequest 。根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据。
在HttpServletResponse到达客户端之前,拦截HttpServletResponse 。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
Filter过滤器使用步骤:1.编写一个类去实现Filter接口。2.实现过滤方法doFilter()。3.到web.xml中去配置Filter拦截路径
①Filter接口中有三个方法
分别是初始化方法init()、拦截方法doFilter()、销毁方法destory();其中doFilter方法是web服务器在调用service()或者doGet()或者doPost方法之前,web服务器对应用程序配置文件进行检查,配置文件有
下面是拦截器类的三个方法。
public class Filter2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void destroy() {
}
}
②web.xml的配置和
AdminFilter
com.comon.filter.AdminFilter
AdminFilter
/admin/*
③关于Filter过滤器拦截路径
简单来说Filter过滤器包含了以下四个阶段
- 构造器方法
- init()初始化方法
第1,2步骤,在web工程启动的时候执行(Filter过滤器已经创建)
3. doFilter()过滤方法,每次拦截请求就会执行
4.destory()销毁,在停止web工程的时候,就会执行(停止web工程,也会销毁Filter过滤器)
/*
初始化
和我们编写的Servlet程序一样,Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,
完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
*/
public void init(FilterConfig filterConfig) throws ServletException;
/*
拦截请求
这个方法完成实际的过滤操作。当客户请求访问与过滤器关联的URL的时候,Servlet过滤器将先执行doFilter方法。FilterChain参数用于访问后续过滤器。
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
/*
销毁
Filter对象创建后会驻留在内存,当web应用移除或服务器停止时才销毁。在Web容器卸载
Filter 对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。
*/
public void destroy();
FilterChain过滤器链就是多个过滤器一起工作。
看图分析:
浏览器发出请求到服务器,在获取服务器的资源之前,首先经过过滤器Filter1,对请求进行拦截后,在经过过滤器Filter2,经过前置代码的过滤符合条件后可以访问目标资源。最后将目标资源经过后置代码的过滤后返回给客户端。 这里需要注意,过滤器执行的优先顺序是由web.xml中从上到下的顺序决定的。
现在大家对于Filter过滤器有一个比较全面的认识,但是在开发中还存在着很多细节的问题有待解决。
Filter接口中有一个doFilter方法,当开发人员编写好Filter类实现doFilter方法,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前(服务器内部对资源的访问机制决定的),都会先调用一下filter的doFilter方法。
Filter的生命周期和Servlet一样,Filter的创建和销毁也是由WEB服务器负责。不过与Servlet区别的是,它是在应用启动的时候就进行装载Filter类(与Servlet的load-on-startup配置效果相同)。容器创建好Filter对象实例后,调用init()方法。接着被Web容器保存进应用级的集合容器中去了等待着,用户访问资源。当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁。注意:init方法与destroy方法只会直接一次。
坚持积累,所谓天才,不过是平时的坚持罢了。