【全面详解】Filter过滤器的使用

  一、什么是过滤器

        Filter称之为过滤器,是SerlvetAPI提供的一个Filter接口,A类实现了这个接口,那么A类称之为过滤器Filter。主要用户的请求(HttpServletRequest)进行预处理,也可以对服务器响应后的数据进行处理。也就是在请求到达服务器处理之前进行拦截,将过滤后符号条件的数据交给服务器进行处理生成响应,最后Filter再对服务器响应的数据进行处理。

       下面以登录权限的验证为例子:用户在没有登录的情况下,是不允许查看html,jsp的界面等等。拦截器在请求到达服务器之前拦截浏览器的请求,如果用户已经登录就让其访问资源。没有登录就会跳转到登录界面需要登录。

【全面详解】Filter过滤器的使用_第1张图片

二、过滤器的功能是什么

在HttpServletRequest到达 Servlet 之前,拦截客户的HttpServletRequest 。根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据。

在HttpServletResponse到达客户端之前,拦截HttpServletResponse 。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

三、Filter过滤器实现原理和实现过程

  Filter过滤器使用步骤:1.编写一个类去实现Filter接口。2.实现过滤方法doFilter()。3.到web.xml中去配置Filter拦截路径

  ①Filter接口中有三个方法

   分别是初始化方法init()、拦截方法doFilter()、销毁方法destory();其中doFilter方法是web服务器在调用service()或者doGet()或者doPost方法之前,web服务器对应用程序配置文件进行检查,配置文件有配置项的时候,然后再去过滤器类进行doFilter()方法中进行拦截。

下面是拦截器类的三个方法。

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过滤器拦截路径的说明

  • 精准匹配 :精确的描述需要拦截的文件  

                        /target.jsp,以上的配置路径,表示请求必须为:http://ip:port/工程路径/target.jsp

  • 目录匹配:对文件夹中的文件信息拦截

                         /admin/*,以上的配置路径,表示请求必须为:http://ip:port/工程路径/admin/*

  • 后缀名配置:*号开头,表示请求地址必须以.html结尾才会被拦截到

                        *.html,以上的配置路径,表示请求必须为:http://ip:port/工程路径/a.html

 

四、Filter的生命周期

  简单来说Filter过滤器包含了以下四个阶段

  1. 构造器方法
  2. 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过滤器链 

    FilterChain过滤器链就是多个过滤器一起工作。

看图分析:

    浏览器发出请求到服务器,在获取服务器的资源之前,首先经过过滤器Filter1,对请求进行拦截后,在经过过滤器Filter2,经过前置代码的过滤符合条件后可以访问目标资源。最后将目标资源经过后置代码的过滤后返回给客户端。 这里需要注意,过滤器执行的优先顺序是由web.xml中从上到下的顺序决定的。         

【全面详解】Filter过滤器的使用_第2张图片

六、总结

       现在大家对于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方法只会直接一次。

      坚持积累,所谓天才,不过是平时的坚持罢了。
 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(【JavaEE基础】,过滤器,java)