Filter

文章目录

  • Filter
    • 快速入门
    • url-pattern
    • 生命周期
    • FilterConfig
    • FilterChain 过滤器链
      • 执行顺序

Filter

Filter 过滤器它是 JavaWeb 的三大组件之一(Servlet 程序、Listener 监听器、Filter 过滤器)。

Filter 过滤器它的作用是:拦截请求,过滤响应。

请添加图片描述

快速入门

创建一个login界面和一个admin界面,只有通过了登录才能访问admin界面

login.html:

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>管理后台登录</title>
</head>
<body>
<h1>管理后台登录</h1>
<form action="/login" method="post">
    u:<input type="text" name="username"/> <br/><br/>
    p:<input type="password" name="password"/> <br/><br/>
    <input type="submit" value="用户登录"/></form>
</body>
</html>

admin.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>admin</h1>
</body>
</html>

servlet:

public class myServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if ("lxg".equals(username) && "123".equals(password)) {
            req.getSession().setAttribute("role", "admin");
            req.getRequestDispatcher("/admin.html").forward(req, resp);
        } else {
            req.getRequestDispatcher("/login.html").forward(req, resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

filter:

public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init()...");
    }

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

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        Object role = request.getSession().getAttribute("role");
        if (role != null && ((String) role).equals("admin")) {
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            ((HttpServletResponse) servletResponse).sendRedirect("login.html");
        }
    }

    @Override
    public void destroy() {
        System.out.println("destroy()...");
    }
}

在web.xml中配置filter

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>com.lhs.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/admin.html</url-pattern>
</filter-mapping>

url-pattern

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)后缀名匹配 <url-pattern>*.jsp</url-pattern> 后缀名可变,比如 *.action *.do 等等对应的请求地址 http://ip[域名]:port/工程路径/xx.jsp , 后缀名为 .jsp 请求会拦截

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

生命周期

请添加图片描述

FilterConfig

FilterConfig 是 Filter 过滤器的配置类。

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

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

FilterConfig接口定义了以下方法:

  • String getFilterName():获取Filter的名称。
  • String getInitParameter(String name):根据参数名称获取Filter的初始化参数值。
  • Enumeration\<String> getInitParameterNames():获取所有的初始化参数名称。
  • ServletContext getServletContext():获取ServletContext对象。

代码示例:拦截指定IP的请求

在web.xml文件中配置要拦截的ip段

<init-param>
    <!-- 封杀 ip 段 -->
    <param-name>ip</param-name>
    <param-value>127.0.0</param-value>
</init-param>
public class MyFilter implements Filter {
    List<String> blockIp;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String ip = filterConfig.getInitParameter("ip");
        blockIp = new ArrayList<>();
        blockIp.add(ip);
        System.out.println("init()...");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String host = request.getRemoteHost();
        System.out.println(host);
        for (String s : blockIp) {
            if (host.contains(s)) {
                System.out.println("封杀成功");
                return;
            }
        }
    }
    
    @Override
    public void destroy() {
        System.out.println("destroy()...");
    }
}

FilterChain 过滤器链

在处理某些复杂业务时,一个过滤器不够,可以设计多个过滤器共同完成过滤任务,形成过滤器链。

请添加图片描述

执行顺序

1)创建A、B两个过滤器

public class MyFilterA implements Filter {
    List<String> blockIp;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("A init()...");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("A过滤器前置代码");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("A过滤器后置代码");
    }

    @Override
    public void destroy() {
        System.out.println("A destroy()...");
    }
}
public class MyfilterB implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("B init()...");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("B过滤器前置代码");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("B过滤器后置代码");
    }

    @Override
    public void destroy() {
        System.out.println("B destroy()...");
    }
}

2)配置web.xml

<filter>
    <filter-name>myFilterA</filter-name>
    <filter-class>com.lhs.filter.MyFilterA</filter-class>
</filter>
<filter-mapping>
    <filter-name>myFilterA</filter-name>
    <url-pattern>/admin.html</url-pattern>
</filter-mapping>
<filter>
    <filter-name>myFilterB</filter-name>
    <filter-class>com.lhs.filter.MyfilterB</filter-class>
</filter>
<filter-mapping>
    <filter-name>myFilterB</filter-name>
    <url-pattern>/admin.html</url-pattern>
</filter-mapping>

3)启动项目后访问admin.html查看过滤器调用顺序如下:

请添加图片描述

可见多个 filter 执行顺序,和 web.xml 配置顺序保持一致。

多个 filter 共同执行时,因为是一次 http 请求, 使用同一个 request 对象,在同一个线程中。

具体过程如下:

Http请求 -> A 过滤器 dofilter() -> A 过滤器前置代码 -> A 过滤器 chain.doFilter() -> B 过滤器 dofilter() -> B 过滤器前置代码 -> B过滤器 chain.doFilter() -> 目标文件 -> B过滤器后置代码 -> A过滤器后置代码 -> 返回给浏览器页面/数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/522550.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

撸代码时,有哪些习惯一定要坚持?

我从2011年开始做单片机开发&#xff0c;一直保持以下撸代码的习惯。 1.做好代码版本管理 有些人&#xff0c;喜欢一个程序干到底&#xff0c;直到实现全部的产品功能&#xff0c;我以前做51单片机的项目就是这样。 如果功能比较多的产品&#xff0c;我不建议这样做&#xff0…

【CSS】背景模糊,不模糊主体文字

问题 背景模糊&#xff0c;不模糊文本 效果图 t1 t2 t3 实现思路 自定义css变量存储图片地址&#xff0c;方便后期更改使用伪元素实现背景模糊达到不遮挡主体文本 transform: scale(1.5)吧图片放大1.5倍&#xff0c;避免设置背景模糊出现白边。 overflow: hidden 超出隐藏&…

摄影师-IP营第5期课程,帮助摄影师涨粉变现(39节课)

课程内容: 1_【直播】千万级营收的摄影师IP做对了什么?.mp4 2_【直播】第1课【流量来源】摄影师如何在小红书涨粉 接单变现?.mp4 3_【直播】第2课【私域成交】摄影师高粘性的朋友园信任打造体系.mp4 4_【直播】第3课【销售谈单】小白&社恐也能学会的摄影谈单术.mp4 …

API力量:用API技术为你的数据安全“上保险”

&#x1f680; API在数据安全领域的核心地位 随着数字化进程的狂飙突进&#xff0c;应用程序接口&#xff08;API&#xff09;已化身为企业内部、不同平台间以及用户交互的关键纽带。它们不仅是数据流动与共享的驱动引擎&#xff0c;更是守护数据安全的重要防线。其中&#x…

【Mathematical Model】基于Python实现随机森林回归算法特征重要性评估线性拟合

前段时间在做遥感的定量反演&#xff0c;所以研究了一下回归算法&#xff0c;由于之前发的几篇博文都是定义好基础方程进行拟合的&#xff0c;不太满足我的需求。所以研究了一下随机森林回归的算法&#xff0c;之前使用随机森林都是做分类&#xff0c;这次做了回归算法也算是补…

微信聊天记录恢复只需简单3招,快速找回聊天内容!

各种社交软件早已深深融入我们的日常生活&#xff0c;无论是与亲朋好友的闲聊&#xff0c;还是与同事伙伴的工作沟通&#xff0c;都离不开它们的陪伴。然而&#xff0c;有时由于误操作、系统更新或手机故障等原因&#xff0c;我们可能会不小心删除了重要的聊天记录&#xff0c;…

基于SSM+Jsp+Mysql的弹幕视频网站

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

UVC紫外杀菌灯珠-消毒杀菌应用解决方案

随着疾病传播的频繁发生以及人们对卫生健康的重视&#xff0c;有效的杀菌措施&#xff0c;更好的消毒杀菌技术越来越重要&#xff0c;为此&#xff0c;工采网提供一系列UVC紫外杀菌灯珠产品&#xff0c;为客户提供适应不同功能应用的UVC杀菌方案。 UVC紫外线杀菌是一种高效、安…

在不同操作系统中搭建Python编程环境

1 在不同操作系统中搭建Python编程环境 1.1 在Linux系统中搭建Python编程环境 1. 检查Python版本 在你的系统中运行应用程序Terminal&#xff08;如果你使用的是Ubuntu&#xff0c;可按Ctrl Alt T&#xff09;&#xff0c;打开一个终端窗口。为确定是否安装了Python&…

Netty学习——源码篇12 Netty池化内存管理机制 备份

1 PooledByteBufAllocator简述 现在来分析池化内存的分配原理。首先找到AbstractByteBufAllocator的子类PooledByteBufAllocator实现分配内存的两个方法&#xff1a;newDirectBuffer和newHeapBuffer方法。 public class PooledByteBufAllocator extends AbstractByteBufAlloc…

Tailwind 4.0 即将到来:前端开发的“速度与激情”

随着前端开发技术的不断进步&#xff0c;我们每天都在寻找更快、更简洁的解决方案来提升我们的开发效率和用户体验。今天&#xff0c;我要为大家介绍一项令人振奋的新技术进展——Tailwind 4.0的来临&#xff01; 对于经常使用Tailwind的朋友们来说&#xff0c;这个消息无疑是激…

1130 - Host ‘36.161.238.56‘ is not allowed to connect to this MySQL server如何处理

1、背景 我在阿里云的ecs安装好了mysql&#xff0c;并且已经安装成功了&#xff0c;我使用navcat客户端连接自己的mysql的时候&#xff0c;却报错&#xff1a;1130 - Host 36.161.238.56 is not allowed to connect to this MySQL server 2、解决 2.1 在服务器终端使用命令行…

引脚数量最少的单片机

引脚数量最少的单片机 2款SOT23-6封装单片机介绍 参考价格 PMS150C-U06 整盘单价&#xff1a;0.19688&#xff0c;该芯片为中国台湾品牌PADAUK(应广) SQ013L-SOT23-6-TR 整盘单价&#xff1a;0.27876&#xff0c;该芯片为国产&#xff1a;holychip(芯圣电子) 上述价格为2024…

OSPF基础实验

一、实验拓扑 二、实验要求 1、按照图示配置IP地址 2、R1&#xff0c;R2&#xff0c;R3运行OSPF使内网互通&#xff0c;所有接口&#xff08;公网接口除外&#xff09;全部宣告进 Area 0&#xff1b;要求使用环回口作为Router-id 3、业务网段不允许出现协议报文 4、R4模拟互…

C++ 指针与结构

三种存取结构成员的方式&#xff1a; ① 通过结构变量名&#xff1b; ②通过指向结构的指针和间接运算符(*)&#xff1b; ③通过指向结构的指针和指向成员运算符(->);

C++ 【桥接模式】

简单介绍 桥接模式属于 结构型模式 | 可将一个大类或一系列紧密相关的类拆分 为抽象和实现两个独立的层次结构&#xff0c; 从而能在开发时分别使用。 聚合关系&#xff1a;两个类处于不同的层次&#xff0c;强调了一个整体/局部的关系,当汽车对象销毁时&#xff0c;轮胎对象…

kettle介绍-Step之CSV Input

CSV Input/CSV 文件输入介绍 CSV 文件输入步骤主要用于将 CSV 格式的文本文件按照一定的格式输入至 流中 Step name:步骤的名称&#xff0c;在单一转换中&#xff0c;名称必须唯一Filename:指定输入 CSV 文件的名称&#xff0c;或通过单击右边的“浏览”按钮指定本地的 CSV …

JavaScript - 请问你是如何中断forEach循环的

难度级别:中高级及以上 提问概率:65% forEach与原始for循环不同的是,并不能通过简单的break或是return中断循环,意思就是不管需要循环的数组有多长,一旦使用了,就会将数组所有元素循环一遍才会结束。其实回答这道题,就要想到forEach的使…

【Kafka】Kafka安装、配置、使用

【Kafka】安装Kafka 1. 安装Kafka2. Kafka使用2.0 集群分发脚本xsync(重要)2.0.1 scp命令2.0.2 rsync远程同步工具2.0.3 写一个集群分发脚本xsync (Shell 脚本) 2.1 Zookeeper安装2.2 对Kafka进行分发2.2.1 执行同步脚本2.2.2 三台云主机配置Kafka环境变量 1. 安装Kafka Kafka…

java自动化-03-04java基础之数据类型举例

1、需要特殊注意的数据类型举例 1&#xff09;定义float类型&#xff0c;赋值时需要再小数后面带f float num11.2f; System.out.println(num1);2&#xff09;定义double类型&#xff0c;赋值时直接输入小数就可以 3&#xff09;另外需要注意&#xff0c;float类型的精度问题…