美文网首页
Servlet——Filter

Servlet——Filter

作者: 嗷老板 | 来源:发表于2018-04-02 22:24 被阅读0次

      Filter和Listener是Servlet规范中的两个高级特性,不同于servlet,他们不用于处理客户端的请求,只用于request,response进行修改,或者对context、session、request事件进行监听,为我们servlet提供一些额外的辅助性功能,帮助我们简化开发。

    一、Filter的概述

      Filter也称之为过滤器,Filter是Servlet技术中最激动人心的技术。Filter可以管理WEB服务器中所有的WEB资源,可以对JSP,Servlet,HTML,以及图片文件等进行拦截和过滤,因此常用与实现一些特殊的功能,比如:访问权限控制,敏感词汇的过滤,乱码的处理等。Filter其实就是一个特殊的Servlet。
      Servlet API提供了Filter接口,在WEB项目中,一个Java类实现了Filter接口,那这个Java类他就是Filter过滤器,Filter其实就是在用户访问目标资源之前,对请求和响应进行拦截过滤和处理。

    Filter的作用
      在HttpServletRequest和HttpServletResponse到达Servlet之前,拦截客户的HttpServletRequest和HttpServletResponse,根据要求检查HTTPServletRequest和HttpServletResponse,也可以修改HttpServletResponse和HttpServletResponse。

    二、Filter的简单案例

    开发步骤:
      在WEB项目中创建一个Java类,让该类实现javax.servlet.Filter接口
      在该类中实现Filter接口的所有方法
      在WEB.xml中进行相关的配置

    创建Java类实现Filter接口

    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class FilterDemo implements Filter{
    
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
                throws IOException, ServletException {
            
            //放行的方法,如果满足条件,就会调用下面的doFilter方法,
            //将request和response对象传给Servlet的service()方法执行
            arg2.doFilter(arg0,arg1);
            
        }
    
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            // TODO Auto-generated method stub
            
        }
    
    }
    

    配置文件的设置:

    <filter>
            <filter-name>FilterDemo</filter-name>
            <filter-class>com.itheima.FilterDemo</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>FilterDemo</filter-name>
            <url-pattern>/*</url-pattern><!-- 拦截资源的路径,/*代表拦截所有web资源 -->
        </filter-mapping>
    

    创建一个jsp文件进行访问:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <h1>hello filter</h1>
    </body>
    </html>
    
    Filter的入门案例

    注意:
      (1)filter是一个特殊的Servlet,所以他的配置和Servlet是一样的,两者的本质区别是,filter不能产生一个请求或者响应,只能修改摸一个资源的请求或者响应
      (2)必须实现javax.servlet.Filter接口,需要在web.xml中进行配置才能生效
      (3)Filter和特定的url关联,当用户请求访问次url时,才会触发filter调用doFilter这个方法。

    三、Filter的生命周期

    创建:
      Filter对象在WEB服务器启动的时候,由WEB服务器帮我们创建,调用init()方法
    销毁:
      Filter对象在WEB服务器关闭的时候会被销毁,调用destroy()方法

    下面我们来测试一下Filter的生命周期:
      首先创建一个Filter,可以使用Eclipse直接创建

    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class FilterDemo2 implements Filter {
    
        public FilterDemo2() {
            // TODO Auto-generated constructor stub
            System.out.println("FilterDemo2的构造方法执行了");
        }
    
        public void destroy() {
            // TODO Auto-generated method stub
            System.out.println("FilterDemo2的destroy执行了");
        }
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            // TODO Auto-generated method stub
            // place your code here
    
            // pass the request along the filter chain
            chain.doFilter(request, response);
            System.out.println("FilterDemo2的doFilter方法执行了");
        }
    
        
        public void init(FilterConfig fConfig) throws ServletException {
            // TODO Auto-generated method stub
            System.out.println("FilterDemo2的init方法执行了");
        }
    
    }
    

    然后修改配置文件:
      将拦截路径url-pattern修改一下,改为“/*”。
    最后访问demo01.jsp进行测试:
      我们可以发现,在重启tomcat的过程中,会输出“FilterDemo2的构造方法执行了”和“FilterDemo2的init方法执行了”,每次访问页面,控制台都会输出一次“FilterDemo2的doFilter方法执行”,最后当我们关闭tomcat的时候,控制台会输出FilterDemo2的destroy执行了。

    四、Filter链

      在同一个WEB应用中,可以开发编写多个Filter,那这多个Filter组成了一个链子,这个链子我们就称之为Filter链,WEB服务器在执行Filter链的时候,会根据Filter在web.xml文件中的配置顺序来执行,如果有任何一个Filter没有放行,那么页面就不会输出。

    示例:
      如果我们将上面两个案例中配置文件信息都写入web.xml,修改第一个案例中的doFilter方法:

    @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
                throws IOException, ServletException {
            System.out.println("FilterDemo执行了");
            //放行的方法,如果满足条件,就会调用下面的doFilter方法,
            //将request和response对象传给Servlet的service()方法执行
            arg2.doFilter(arg0,arg1);
            
        }
    

      访问demo01.jsp后,我们发现浏览器输出了内容,控制台也输出了两条信息“FilterDemo执行了”和“FilterDemo2的doFilter方法执行”,说明我们的两个Filter都放行了,最后jsp文件可以执行;
      如果我们将上面doFilter方法中的doFilter方法注释掉:

    @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
                throws IOException, ServletException {
            System.out.println("FilterDemo执行了");
            //放行的方法,如果满足条件,就会调用下面的doFilter方法,
            //将request和response对象传给Servlet的service()方法执行
            //arg2.doFilter(arg0,arg1);
            
        }
    

      这时我们会发现,页面没有输出“hello filter”,同时控制台只输出了“FilterDemo执行了”,说明我们的访问在第一个Filter处被拦截了,后面的访问都无法执行。

    五、获取Filter的初始化参数

      在web.xml文件中,可以通过<init-param>标签来为Filter配置初始化参数,WEB服务器在创建Filter对象的时候,会调用Filter对象的init方法,并且将封装了Filter初始化参数的FilterConfig对象传递进去。在Filter的init方法中,就可以通过FilterConfig对象来获取Filter的初始化参数,参数在服务器打开的时候就会被获取到。
    配置文件

      <filter>
        <display-name>FilterDemo3</display-name>
        <filter-name>FilterDemo3</filter-name>
        <filter-class>com.itheima.FilterDemo3</filter-class>
        
        <init-param>
        <param-name>username</param-name>
        <param-value>zhangsan</param-value>
        </init-param>
        <init-param>
        <param-name>password</param-name>
        <param-value>123456</param-value>
        </init-param>
        
      </filter>
    <filter-mapping>
        <filter-name>FilterDemo3</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    

    Filter中获取初始化参数

    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class FilterDemo3 implements Filter {
    
        public FilterDemo3() {
            // TODO Auto-generated constructor stub
        }
    
        public void destroy() {
            // TODO Auto-generated method stub
        }
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            // TODO Auto-generated method stub
            // place your code here
    
            // pass the request along the filter chain
            chain.doFilter(request, response);
        }
    
    
        public void init(FilterConfig fConfig) throws ServletException {
            String username = fConfig.getInitParameter("username");
            String password = fConfig.getInitParameter("password");
            System.out.println(username);
            System.out.println(password);
        }
    
    }
    
    控制台信息

    相关文章

      网友评论

          本文标题:Servlet——Filter

          本文链接:https://www.haomeiwen.com/subject/dmpthftx.html