Filter的url-pattern、Filter的生命周期以及FilterConfig和一个拦截访问的小案例

1.url-pattern:Filter的拦截路径,即浏览器在请求什么位置的资源时,过滤器会进行拦截

2.精准匹配<url-pattern>/a.jsp</url-pattern>对应的请求地址:http://ip域名:port/工程路径/a.jsp会拦截

3.目录匹配<url-pattern>/manage/*</url-pattern>对应的请求地址http://ip域名:port/工程路径/manage/xx,即web工程manage目录下所有的资源都会拦截

4.后缀名匹配

XML 复制代码
<!--
<url-pattern>*.jsp</url-pattern>后缀可改变,比如:*.action *.do等等对应的请求
-->

5.Filter过滤器只关心请求的地址是否匹配,不关心请求的资源是否存在

Filter的生命周期

图解
注意:

1.filter在web项目启动时,由tomcat来创建filter实例,只会创建一个

2.会调用filter的无参构造器,同时会调用init()方法,只会调用一次

3.在创建filter实例时,同时会创建FilterConfig对象,并通过init()方法传入

4.通过FilterConfig对象,可以获取该filter的相关配置信息

5.当一个http请求和该filter的url-patter匹配时,就会调用doFilter方法

6.在调用doFilter方法时,tomcat会同时创建 servletRequest对象 和 servletResponse对象 和 filterChain对象并通过doFilter方法传入

7.如果后面的请求目标资源(jsp/html...)会使用到request和response ,那么会继续传递

FilterConfig

说明:

1.FilterConfig时Filter过滤器的配置类

2.Tomcat每次创建FIlter的时候,也会创建一个FilterConfig对象,这里包含了Filter配置文件的配置信息

3.FilterConfig对象作用是获取filter过滤器的配置内容

FilterConfig的使用
java 复制代码
package com.filter;

import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;

/**
 * 演示FilterConfig的使用
 */
public class FilterConfigTest implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //通过filterConfig 获取相关的参数
        String filterName = filterConfig.getFilterName();
        String ip = filterConfig.getInitParameter("ip");
        ServletContext servletContext = filterConfig.getServletContext();
        //可以获取到该filter所有的配置参数名
        Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();

        //遍历枚举
        while (initParameterNames.hasMoreElements()){
            System.out.println("名字="+initParameterNames.nextElement());
        }

        System.out.println("FilterName=" + filterName);
        System.out.println("ip=" + ip);
        System.out.println("servletContext=" + servletContext);

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    }

    @Override
    public void destroy() {

    }
}
web.xml文件中配置的相关信息,IP等参数根据需求来写
XML 复制代码
 <filter>
        <filter-name>FilterConfigTest</filter-name>
        <filter-class>com.filter.FilterConfigTest</filter-class>
        <init-param>
            <param-name>id</param-name>
            <param-value>168.16.15.13</param-value>
        </init-param>
        <init-param>
            <param-name>port</param-name>
            <param-value>8989</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>FilterConfigTest</filter-name>
        <url-pattern>/abc/*</url-pattern>
    </filter-mapping>
测试:简单的案例
需求:如果访问ip是128.12网段开始的IP地址,就返回登录页面(也就是ip地址由128.12开头,就不允许访问)

注意:web.xml文件中需要写一个IP,然后值为128.12,如下

XML 复制代码
<filter>
        <filter-name>FilterConfigTest</filter-name>
        <filter-class>com.filter.FilterConfigTest</filter-class>
        <init-param>
            <param-name>id</param-name>
            <param-value>128.12</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>FilterConfigTest</filter-name>
        <url-pattern>/abc/*</url-pattern>
    </filter-mapping>
java 复制代码
public class FilterConfigTest implements Filter {
    private String ip;

    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
         ip = filterConfig.getInitParameter("ip");
        }
     @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //通过forbidden ip来进行控制
        //先获取到访问ip
        String remoteAddr = servletRequest.getRemoteAddr();
        if(remoteAddr.contains(ip)){
            System.out.println("封杀该网段");
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
            return;//直接返回
        }
        //继续访问目标资源
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}
相关推荐
坤坤子吖2 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
文丑颜不良啊5 小时前
LeetCode2821~2840题目解析
java·leetcode
apcipot_rain5 小时前
C++转Java日记(10)
java·开发语言
简 洁 冬冬6 小时前
泛型方法写法全面辨析:从「能编译」到「能跑」到「能用」
java·泛型
YLCHUP6 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
LGL6030A6 小时前
Java学习历程31——初识Spring Boot
java·spring boot·学习
旖旎夜光8 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
Lansonli8 小时前
大数据Spark(八十八):Spark任务资源之Standalone集群测试
java·服务器·spark
budingxiaomoli9 小时前
Spring AOP
java·spring·java-ee
特立独行的猫A9 小时前
Ionic + 仓颉语言的 cj-tauri 开发框架实战:开发精美移动端 APP
java·后端·python