zoukankan      html  css  js  c++  java
  • Filter(过滤器)

    1.什么是Filter(过滤器)?
    2.编写Filter
    3.Filter生命周期
    4.多个Filter执行顺序
    5.FilterConfig对象

    #什么是Filter(过滤器)?
    Filter过滤器是servlet中提供的一个接口,用来拦截请求和响应,从而实现一些特殊处理

    #编写Filter
    只需要实现javax.servlet.Filter 接口即可

    package com.mike;
    
    import javax.servlet.*;
    import java.io.IOException;
    /**
     * @author mike
     * @date 2020-11-21
     * @desc 实现一个Filter类
     */
    
    public class MyFilter implements Filter {
    	@Override
    	public void init(FilterConfig filterConfig)throws ServletException{
    		System.out.println("Filter初始化");
    	}
    
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain)throws ServletException,
    	IOException{
    		request.setCharacterEncoding("UTF-8");
    		response.setCharacterEncoding("UTF-8");
    		response.setContentType("text/html");
    		System.out.println("拦截前"); //在过滤前设置请求和响应编码
    		filterChain.doFilter(request,response);
    		System.out.println("拦截后");
    	}
    }
    
    

    在web.xml中配置过滤器规则

       <!--配置过滤器-->
        <filter>
            <filter-name>MyFilter</filter-name>
            <filter-class>com.mike.MyFilter</filter-class>
        </filter>
        <!--映射过滤器-->
        <filter-mapping>
            <filter-name>MyFilter</filter-name>
            <!--/* 表示拦截所有请求-->
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    

    随便访问一个servlet,如http://localhost:8080/helloServlet 观察输出信息

    #Filter生命周期
    在Filter接口中定义了三个方法

    package javax.servlet;
    
    import java.io.IOException;
    
    public interface Filter {
        void init(FilterConfig var1) throws ServletException;
    
        void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
    
        void destroy();
    }
    

    对于这三个方法的介绍:
    init(FilterConfig var1):表示Filter对象的初始化方法,在Filter对象创建时执行(只执行一次),并且传入一个FilterConfig类型的参数,该参数封装了Filter的初始化参数。
    doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3):表示Filter执行过滤的核心方法,如果某资源在已经被配置到这个Filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法,注意 这里的request和response没有http需要强制转换。
    destory():表示Filter销毁方法,当Filter对象销毁时执行该方法(仅执行一次)。

    #多个Filter执行顺序

    编写多个Filter可以组成Filter链条,web容器会按照一定的顺序执行。当在web.xml中定义Filter规则时,容器会按照filter-mapping配置先后顺序执行,如果使用注解配置则按照类名先后执行。当分别在web.xml和注解中都有配置,则先从web.xml中加载,再从注解中加载,第一个Filter的doFilter方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则Web服务器会检查FilterChain对象中是否还有Filter,如果还有,则调用第2个Filter,依次类推,直到没有可以调用目标资源。当有4个Filter,CFilter,BFilter,AFilter,DFilter,其中C,B使用注解,A,D使用web.xml定义,它们的执行顺序,如下

    FilterConfig对象
    FilterConfig对象是Filter在初始化时会读取web.xml配置中的filter中的init-param配置信息,可通过FilterConfig对象的一些方法可以获取初始化配置,有如下方法

    String getFilterName():返回Filter的名称。
    String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
    Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
    ServletContext getServletContext():返回Servlet上下文对象的引用。
    

    在web.xml的filter中加入init-param配置信息

      <filter>
            <filter-name>MyFilter</filter-name>
            <filter-class>com.mike.MyFilter</filter-class>
            <!--配置初始化信息-->
            <init-param>
                <param-name>name</param-name>
                <param-value>mike</param-value>
            </init-param>
            <init-param>
                <param-name>password</param-name>
                <param-value>8888</param-value>
            </init-param>
        </filter>
    

    在MyFilter的init中获取初始化配置

    package com.mike;
    
    import javax.servlet.*;
    import java.io.IOException;
    /**
     * @author mike
     * @date 2020-11-21
     * @desc 实现一个Filter类
     */
    
    public class MyFilter implements Filter {
    	@Override
    	public void init(FilterConfig filterConfig)throws ServletException{ //init方法只会在容器启动时候调用一次,
    		System.out.println("Filter初始化");
    		//获取过滤器名字
    		String filterName = filterConfig.getFilterName();
    		//获取web.xml中配置的filter初始化信息
    		String name = filterConfig.getInitParameter("name");
    		String password = filterConfig.getInitParameter("password");
    		System.out.println(name);
    		System.out.println(password);
    	}
    
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain)throws ServletException,
    	IOException{
    		request.setCharacterEncoding("UTF-8");
    		response.setCharacterEncoding("UTF-8");
    		response.setContentType("text/html");
    		System.out.println("拦截前");
    		filterChain.doFilter(request,response);
    		System.out.println("拦截后");
    	}
    }
    
    

    随便访问一个servlet查看输出信息 http://localhost:8080/helloServlet

    还可通过注解配置filter的init-param,效果和使用web.xml配置一致

    package com.mike;
    
    import javax.servlet.*;
    import java.io.IOException;
    /**
     * @author mike
     * @date 2020-11-21
     * @desc 实现一个Filter类
     */
    
    @WebFilter(filterName = "MyFilter",value = "/*",initParams = {
    	  @WebInitParam(name = "name", value = "mike"),/*这里配置初始化的参数*/
              @WebInitParam(name = "password", value = "8888")/*相当于<init-param>*/
    })
    public class MyFilter implements Filter {
    	@Override
    	public void init(FilterConfig filterConfig)throws ServletException{
    		System.out.println("Filter初始化");
    		//获取过滤器名字
    		String filterName = filterConfig.getFilterName();
    		//获取web.xml中配置的filter初始化信息
    		String name = filterConfig.getInitParameter("name");
    		String password = filterConfig.getInitParameter("password");
    		System.out.println(filterName);
    		System.out.println(name);
    		System.out.println(password);
    	}
    
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain)throws ServletException,
    	IOException{
    		request.setCharacterEncoding("UTF-8");
    		response.setCharacterEncoding("UTF-8");
    		response.setContentType("text/html");
    		System.out.println("拦截前");
    		filterChain.doFilter(request,response);
    		System.out.println("拦截后");
    	}
    }
    
    
  • 相关阅读:
    Windows Phone 8初学者开发—第2部分:安装Windows Phone SDK 8.0
    Windows Phone 8初学者开发—第1部分:系列介绍
    开始翻译Windows Phone 8 Development for Absolute Beginners教程
    Windows 8 动手实验系列教程 实验8:Windows应用商店API
    Windows 8 动手实验系列教程 实验7:磁贴和通知
    Windows 8 动手实验系列教程 实验6:设置和首选项
    Windows 8 动手实验系列教程 实验5:进程生命周期管理
    Unix时间戳计算
    转载css层级优先级。
    增加原型方法写出删除一个数组相同元素的函数
  • 原文地址:https://www.cnblogs.com/gy1010/p/14015147.html
Copyright © 2011-2022 走看看