• javaWeb过滤器Filter(二)


    一、FilterChain 过滤器链

    多个Filter对同一个资源进行拦截就可以形成过滤器链,同一个资源是指的匹配路径一致
    多个Filter过滤器是根据配置的顺序来执行,谁在前,先执行谁

    二、Filter的生命周期

    1、生命周期流程

    和servlet 生命周期类似:实例化-》初始化->服务-》销毁

    Filter的生命周期
    服务器启动时,会创建Filter对象, 并调用init方法,只调用一次
    当访问资源的时,路径与Filter的拦截路径匹配,会执行Filter的doFilter方法
    当服务器关闭时,会调用Filter 的destroy方法进行销毁

    2、代码展示

    package com.heihei;
    
    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 MyFilter implements Filter{
    
    	@Override
    	public void destroy() {
    		System.out.println("Filter destroy ");
    		
    	}
    
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    			throws IOException, ServletException {
    		System.out.println("拦截开始");
    		
    		//放行
    		chain.doFilter(request, response);
    		System.out.println("结束拦截,资源过滤后,回来了");
    		
    	}
    
    	@Override
    	public void init(FilterConfig arg0) throws ServletException {
    		System.out.println("Filter init ");
    		
    	}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    三、FilterConfig对象说明

    Filter初始化方法init上的一个参数 ,就是FilterConfig对象

    public interface Filter {
        void init(FilterConfig var1) throws ServletException;
    
        void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
    
        void destroy();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    MyFilterConfig

    package com.heihei;
    
    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 MyFilterConfig implements Filter{
    
    	private FilterConfig config;
    	@Override
    	public void init(FilterConfig config) throws ServletException {
    		this.config = config;
    		
    	}
    
    	@Override
    	public void doFilter(ServletRequest req, ServletResponse rsp, FilterChain chain)
    			throws IOException, ServletException {
    		//通过FilterConfig对象获取配置文件中的初始化信息
    		String coding = config.getInitParameter("encoding");
    		System.out.println(coding);
    		req.setCharacterEncoding(coding);
    		chain.doFilter(req, rsp);
    		
    	}
    	@Override
    	public void destroy() {
    		// TODO Auto-generated method stub
    		
    	}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    ServletDemo

    package com.heihei;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ServletDemo extends HttpServlet{
    	
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		System.out.println("ServletDemo");
    	}
    	
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		super.doPost(req, resp);
    	}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    web.xml

    
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      
      <filter>
      	<filter-name>MyFilterConfigfilter-name>
      	<filter-class>com.heihei.MyFilterConfigfilter-class>
      	<init-param>
    		<param-name>encodingparam-name>
    		<param-value>UTF-8param-value>  	
      	init-param>
      filter>
      
      <filter-mapping>
      	<filter-name>MyFilterConfigfilter-name>
      	<url-pattern>/*url-pattern>
      filter-mapping>
      
      
      <servlet>
      	<servlet-name>ServletDemoservlet-name>
      	<servlet-class>com.heihei.ServletDemoservlet-class>
      servlet>
      <servlet-mapping>
      	<servlet-name>ServletDemoservlet-name>
      	<url-pattern>/ServletDemourl-pattern>
      servlet-mapping>
    web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    四、Filter配置

    1、匹配规则

    在web.xm文件中,标签的匹配规则:
    完全匹配	 以"/demo",不包含通配符
    目录匹配		以"/"开头,以"*"结束
    扩展名匹配:	 *.xxxx,不能写成 /*.xxx ,比如 *.do
    
    • 1
    • 2
    • 3
    • 4

    2、servlet-name 标签

    也可以直接通过配置标签,来关联到servlet对应的servlet-mapping配置,从而达到拦截的目的
    
      	MyFilterConfig
    	ServletDemo
      
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3、dispatcher 标签

    标签,默认是request请求,可以写多个dispatcher标签,比如:
     
      	MyFilterConfig
      	****
    	REQUEST
    	FORWARD
      
    
    REQUEST:默认值,只过滤客户端请求和重定向
    
    FORWARD:只过滤转发请求
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    腾讯云服务器秒杀什么时候开始?腾讯云服务器秒杀时间
    Java工程师的工资高吗?一般多少钱?
    GridSearchCV 工具介绍
    centos 上容器配置X11
    观测云产品更新|新增基础设施 YAML 显示;新增日志查看器 DQL 搜索模式;优化应用性能监测等
    python如何批量创建文件与文件夹
    为什么应该在开发环境中使用 Kubernetes
    linux 下载 安装 php详细步骤与nginx配置
    【云原生之Docker实战】使用Docker部署Taskcafe项目管理工具
    【1day】复现宏景OA KhFieldTree接口 SQL注入漏洞
  • 原文地址:https://blog.csdn.net/weixin_43860634/article/details/126844853