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() {

    }
}
相关推荐
庞轩px11 分钟前
线程池核心参数与拒绝策略深度解析
java·jvm·数据库
Roselind_Yi12 分钟前
从线性回归实战到Python依赖安装踩坑:我的机器学习入门排雷记
笔记·python·算法·机器学习·回归·线性回归·学习方法
guestsun15 分钟前
Idea反编译插件--方便查看和修改class文件
java·intellij-idea·jar·反编辑工具·idea反编译插件·class反编译·jar反编译
工边页字16 分钟前
图文教学,服务端如何发送(钉钉 +飞书 )机器人通知
java·前端·后端
tuokuac25 分钟前
Spring 最核心的注解@Bean本质
java·后端·spring
jiankeljx25 分钟前
Spring Boot 经典九设计模式全览
java·spring boot·设计模式
Lyyaoo.25 分钟前
Spring中的拦截器
java·后端·spring
工程师老罗27 分钟前
LVGL文本显示问题,编码问题
java·开发语言
宵时待雨28 分钟前
C++笔记归纳15:红黑树
开发语言·数据结构·c++·笔记
黑眼圈子29 分钟前
牛客刷题记录5
java·开发语言·学习·算法