Filter过滤器(超详细)

article/2025/9/6 14:14:13

声明:本文是根据博主学习内容所整理得的笔记,仅作为交流学习使用,需要观看视频的请移步:http://www.atguigu.com/

1.Filter ?什么是过滤器

  1. Filter 过滤器它是 JavaWeb 的三大组件之一。
    三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
  2. Filter 过滤器它是 JavaEE 的规范。也就是接口
  3. Filter 过滤器它的作用是:拦截请求,过滤响应。

拦截请求常见的应用场景有:
1.权限检查 2.日记操作 3.事务管理 ……等等

2.Filter 初体验

要求:在你的 web 工程下,有一个 admin 目录。这个 admin 目录下的所有资源(html 页面、jpg 图片、jsp 文件…等等)都必须是用户登录之后才允许访问。

思考:根据之前我们学过内容。我们知道,用户登录之后都会把用户登录的信息保存到 Session 域中。所以要检查用户是否登录,可以判断 Session 中否包含有用户登录的信息,即可!!!

a.jsp:

<body><%Object user = session.getAttribute("user");// 如果 user = null; 说明 user 还没有登陆if (user == null) {request.getRequestDispatcher("/login.jsp").forward(request,response);return;     // 一般请求转发后,就不允许再执行任何代码,这里就直接return了}%>我是 a.jsp 文件
</body>

但是在 html 页面当中应该怎么写呢? 需要使用 Filter 过滤器

Filter 的工作流程图:

在这里插入图片描述

Filter 过滤器的使用步骤:

​ 1.编写一个类去实现 Filter 接口
​ 2.实现过滤方法 doFilter()
​ 3.到 web.xml 中去配置 Filter 的拦截路径

AdminFilter.java(继承了Filter类):

/*** doFilter 方法,专门用来拦截请求,可以做权限检查* @param servletRequest* @param servletResponse* @param filterChain* @throws IOException* @throws ServletException*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;HttpSession session = httpServletRequest.getSession();Object user = session.getAttribute("user");// 如果 user = null; 说明 user 还没有登陆if (user == null) {httpServletRequest.getRequestDispatcher("/login.jsp").forward(httpServletRequest,servletResponse);return;     // 一般请求转发后,就不允许再执行任何代码,这里就直接return了} else {// 让程序继续往下访问用户的目标资源filterChain.doFilter(servletRequest,servletResponse);}
}

这时候已经有权限检查代码了,但是还不知道要去哪检查,这时候需要去 xml 配置一下检查什么。

<!--filter标签用于配置一个Filter过滤器-->
<filter><!--给 filter 起一个别名--><filter-name>Adminfilter</filter-name><!--配置 filter 全类名--><filter-class>com.filter.AdminFilter</filter-class>
</filter>
<!--配置 filter 过滤器的拦截路径-->
<filter-mapping><!--表示当前的拦截路径给哪个filter过滤器使用--><filter-name>Adminfilter</filter-name><!--配置拦截路径/ 表示请求地址为: http://ip:port/工程路径/ 映射到 IDEA 的 web 目录/admin/* 表示请求地址为 http://ip:port/工程路径/admin/*  (admin 下的全部)--><url-pattern>/admin/*</url-pattern>
</filter-mapping>

完整的用户登录和权限检查:

login.jsp:

<body>这是登陆页面:login.jsp 页面 <br><form action="http://localhost:8080/15_filter/loginServlet" method="get">用户名:<input type="text" name="username"/> <br>密码:<input type="password" name="password"/> <br><input type="submit" /></form>
</body>

LoginServlet.java:

@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 ("wzg168".equals(username) && "123456".equals(password)) {req.getSession().setAttribute("user",username);resp.getWriter().write("登录 成功!!!");} else {req.getRequestDispatcher("/login.jsp").forward(req,resp);}
}

3.Filter 的生命周期

Filter 的生命周期包含几个方法

  1. 构造器方法

  2. init 初始化方法
    第 1,2 步,在 web 工程启动的时候执行(Filter 已经创建)
    在这里插入图片描述

  3. doFilter 过滤方法
    第 3 步,每次拦截到请求,就会执行(访问 admin 目录下的 a.jsp 页面,访问一次,拦截一次请求)
    在这里插入图片描述

  4. destroy 销毁
    第 4 步,停止 web 工程的时候,就会执行(停止 web 工程,也会销毁 Filter 过滤器)
    在这里插入图片描述

4.FilterConfig 类

FilterConfig 类见名知义,它是 Filter 过滤器的配置文件类。
Tomcat 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类,这里包含了 Filter 配置文件的配置息。

FilterConfig 类的作用是获取 filter 过滤器的配置内容

  1. 获取 Filter 的名称 filter-name 的内容
  2. 获取在 Filter 中 wen.xml 配置的 init-param 初始化参数
  3. 获取 ServletContext 对象
    @Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("2.Filter 初始化方法 init(FilterConfig filterConfig)");//        1. 获取 Filter 的名称 filter-name 的内容 (web-xml 中配置的名称)System.out.println("filter-name:" + filterConfig.getFilterName());
//        2. 获取在 web.xml 中配置的 init-param 初始化参数System.out.println("初始化参数username的值是:" + filterConfig.getInitParameter("username"));System.out.println("初始化参数url的值是:" + filterConfig.getInitParameter("url"));
//        3. 获取 ServletContext 对象System.out.println(filterConfig.getServletContext());}

5.FilterChain 过滤器链

Filter 过滤器
Chain 链,链条
FilterChain 就是过滤器链(多个过滤器如何一起工作)

FilterChain.doFilter() 方法的作用:

​ 1.执行下一个Filter过滤器(如果有Filter)
​ 2.执行目标资源

Filter过滤器的执行细节:

在这里插入图片描述

Filter1.java:

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

Filter2.java:

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

target.jsp:

<body><%System.out.println("target.jsp页面执行了");%>
</body>

web.xml:

<filter><filter-name>Filter1</filter-name><filter-class>com.filter.Filter1</filter-class>
</filter>
<filter-mapping><filter-name>Filter1</filter-name><url-pattern>/target.jsp</url-pattern>
</filter-mapping>
<filter><filter-name>Filter2</filter-name><filter-class>com.filter.Filter2</filter-class>
</filter>
<filter-mapping><filter-name>Filter2</filter-name><url-pattern>/target.jsp</url-pattern>
</filter-mapping>

访问 target.jsp:
在这里插入图片描述

可见其执行顺序。

另外,要是在 xml 中,把 Filter2 放在 Filter1 上面,就会先执行 Filter2,再执行 Filter1。也就是说:在多个 Filter 过滤器执行的时候,他们的优先顺序是由他们在 web.xml 中从上到下配置的顺序决定的!

补充:
多个Filter过滤器执行的特点:

  1. 所有filter和目标资源默认都执行同一个线程中
  2. 多个Filter过滤器同时执行的时候,他们都要使用同一个Request对象

补充1演示:在 Filter1 和 Filter2 的 filterChain.doFilter(servletRequest,servletResponse); 的前后,都使用 Thread.currentThread().getName() 获取线程名,另外 target.jsp 页面中也使用 Thread.currentThread().getName() 获取线程名,运行结果显示:

在这里插入图片描述

访问:http://localhost:8080/15_filter/target.jsp
结果显示,线程相同。

补充2演示:在 Filter1 和 Filter2 的 filterChain.doFilter(servletRequest,servletResponse); 的前后,都使用servletRequest.getParameter(“username”) 获取 request 对象的 name,target.jsp 中使用 request.getParameter(“username”) 获取 request 对象的 name,运行结果显示:
在这里插入图片描述

访问:http://localhost:8080/15_filter/target.jsp?username=12345
结果显示, request 对象相同。

6.Filter 的拦截路径

–精确匹配

<filter-mapping><filter-name>Filter2</filter-name><url-pattern>/target.jsp</url-pattern>  <!--精确匹配-->
</filter-mapping>

以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp

–目录匹配

<filter-mapping><filter-name>Adminfilter</filter-name><url-pattern>/admin/*</url-pattern> <!--目录匹配-->
</filter-mapping>

以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*

–后缀名匹配

<filter-mapping><filter-name>Filter2</filter-name><url-pattern>*.html</url-pattern>  <!--后缀名匹配-->
</filter-mapping>

以上配置的路径,表示请求地址必须以.html 结尾才会拦截到

<filter-mapping><filter-name>Filter2</filter-name><url-pattern>*.do</url-pattern>  <!--后缀名匹配-->
</filter-mapping>

以上配置的路径,表示请求地址必须以.do 结尾才会拦截到

<filter-mapping><filter-name>Filter2</filter-name><url-pattern>*.action</url-pattern>  <!--后缀名匹配-->
</filter-mapping>

以上配置的路径,表示请求地址必须以.action 结尾才会拦截到

<filter-name>Filter2</filter-name>
<url-pattern>*.do</url-pattern>  <!--后缀名匹配-->
```

以上配置的路径,表示请求地址必须以.do 结尾才会拦截到

<filter-mapping><filter-name>Filter2</filter-name><url-pattern>*.action</url-pattern>  <!--后缀名匹配-->
</filter-mapping>

以上配置的路径,表示请求地址必须以.action 结尾才会拦截到

Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在(只看后缀名是否等于,不关心后缀名在现实中是否真的存在)!!!


http://chatgpt.dhexx.cn/article/vfbnrxc8.shtml

相关文章

GitHub使用教程(完整教程)

第一步&#xff1a;进入官网 &#xff08;https://github.com/&#xff09; 第二步&#xff1a;新建账号——输入用户名&#xff0c;邮箱&#xff0c; 密码——邮箱确认——登录GitHub 第三步&#xff1a;创建仓库 第三步&#xff1a;查看仓库 第四步&#xff1a;实现本地项目…

Git和Github详细入门教程(别再跟我说你不会Git和Github)

前言&#xff1a;基础差建议先观看B站视频&#xff08;关键字&#xff1a;GitHub&#xff09;&#xff0c;该教程是根据视频教程而制。 文章目录 01.Git概述02.Git的本地仓库操作 Git的版本回退操作 03.远程仓库05.Git的分支操作06.冲突的产生与解决07.Git实用功能08.忽略文件0…

GitHub Actions 入门教程

https://jiangren.com.au/blog/github-actions 一、GitHub Actions 是什么&#xff1f; 大家知道&#xff0c;持续集成由很多操作组成&#xff0c;比如抓取代码、运行测试、登录远程服务器&#xff0c;发布到第三方服务等等。GitHub 把这些操作就称为 actions。 很多操作在不…

小白入门~ GitHub和Git超详细使用教程

https://github.com/ 这是GitHub的官方网站&#xff0c;在官网上可以注册属于自己的GitHub账号&#xff0c;网上是全英文的&#xff0c;对于英语不好的同学建议使用谷歌浏览器&#xff0c;谷歌浏览器可以翻译网页变为中文使用起来十分方便。 通过简单的步骤之后你就会有一个属于…

GitHub使用教程(项目下载)

1.登录GitHub后选择左上角搜索框&#xff08;以点餐系统为例&#xff09; 2.选择合适的项目进入 3.选择合适的项目进入后&#xff0c;点击Code 4.点击Download ZIP即可下载项目代码压缩包

github使用教程图文详解(一)[入门]

git的使用和踩坑 Git的注册下载本地github工具绑定ssh秘钥获取ssh秘钥官网绑定ssh秘钥 创建远程库初始化仓库设置全局签名和单仓库签名的作用单仓库签名全局用户签名 提交到本地仓库git区域的划分提交到缓存区提交本地仓库和备注提交总结注意: 提交到远程仓库克隆远程仓库总结 …

GitHub 的 10 分钟快速入门教程

Hello World 这一篇是 GitHub 的 10 分钟快速入门教程&#xff0c;因为找不到中文版&#xff0c;大橙子自己给大家翻译了一下。 Hello World 项目是计算机编程的一个历史悠久的传统。这一篇我们也通过这个简单的练习让你学习到新的知识。那么就让我们开始 GitHub 的学习旅程吧…

【Github教程】史上最全github使用方法:github入门到精通

【初识Github】 首先让我们大家一起喊一句“Hello Github”。YEAH!就是这样。 Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理。在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中。目前,包括Rubinius和Merb在内的很多知名…

Github和Git的基本教程,适合新手

借鉴了这个博主的笔记 观看了b站up主的视频 Github和Git的基本使用 Github一.基本概念二 .创建账号三.创建仓库四&#xff1a;仓库管理五.仓库主页英文介绍 Git一. Git优势二.下载地址三.基本信息设置四.工作区域&#xff08;上传文件到Github&#xff09;五.删除文件六. 修改…

github入门教程最全中文版(官方)

该的Hello World项目是计算机编程历史悠久的传统。这是一个简单的练习&#xff0c;可以让你在学习新东西时开始学习。让我们开始使用GitHub&#xff01; 您将学习如何&#xff1a; 创建和使用存储库启动并管理新分支对文件进行更改并将其作为提交推送到GitHub打开并合并拉取请…

github注册以及安装教程

github注册以及安装教程 首先&#xff0c;我们了解一下github.gitHub 是一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持 git 作为唯一的版本库格式进行托管&#xff0c;故名 gitHub。github 于 2008 年 4 月 10 日正式上线&#xff0c;除了 git 代码仓库托管及基…

GitHub快速上手--GitHub高效操作教程

一、前言 如果你正在看我的这篇文章&#xff0c;说明你已经对GitHub有了一些基础的了解&#xff0c;下面我们将详细叙述每一步的操作&#xff0c;以保证你能够快速上手GitHub&#xff0c;完成对代码的管理。 二、创建仓库 登录GitHub账号&#xff0c;点击页面右上角的加号&am…

GitHub使用教程-官网指南

此文为GitHub官网操作示例&#xff0c;英文原版见下文或访问地址&#xff1a;Hello World GitHub Guides Hello World 十分钟教学指南 Hello World项目在计算机编程领域是一个历史悠久的传统。当你学习一些新的东西的时候&#xff0c;它是你开始学习的一个简单的练习。让我…

GitHub注册教程(图文详解)

一、注册github流程 1.首先进入github官网 https://github.com/ 2.点击绿色框Sign up for GitHub进行注册 3.注册页面第一栏email&#xff08;邮箱&#xff09;&#xff0c;第二栏password&#xff08;密码&#xff09;&#xff0c;第三栏username&#xff08;用户名&#xff…

手把手教你简易上手GitHub(教程)

1.创建仓库 仓库是存储想法、资源甚至与他人共享和讨论的地方。&#xff08;记笔记的地方&#xff09; 在任何页面的右上角&#xff0c;使用 下拉菜单选择 New repository&#xff08;新建仓库&#xff09;。 在 Repository name&#xff08;存储库名称&#xff09;框中&am…

Github注册教程

GitHub注册教程 目录 一&#xff0e; 认识GitHub二&#xff0e; 注册GitHub三&#xff0e; 使用GitHub 一&#xff0e; 认识GitHub GitHub是一个托管代码的网站&#xff0c;只支持Git作为唯一的版本库格式进行托管。2018年6月4日&#xff0c;微软收购GitHub。 二&#xff0e; 注…

GitHub教程 Git Bash详细教程

文章目录 1 下载安装2 设置用户3 本地文件夹的操作 3.1 进入文件夹3.2 查看3.3 退出文件夹3.4 新建、删除 4 仓库设置 4.1 初始化本地仓库4.2 新建远程仓库4.3 建立连接4.4 文件上传4.5 文件下拉4.5 文件克隆 这个主要介绍Git Bash的使用教程。 1 下载安装 首先抛一个Win…

GitHub——入门教程

一、注册GitHub账号 GitHub官网https://github.com/ 注册之后&#xff0c;登录注册的邮箱验证后注册完成。 二、下载Git 有Mac&#xff0c;Windows&#xff0c;Linux版本的。下载地址&#xff1a;https://git-scm.com/downloads 下载完后&#xff0c;打开安装&#xff0c;一…

Github教程】史上最全github使用方法:github入门到精通

【Github教程】史上最全github使用方法&#xff1a;github入门到精通 【初识Github】 首先让我们大家一起喊一句“Hello Github”。YEAH!就是这样。 Git是一个分布式的版本控制系统&#xff0c;最初由Linus Torvalds编写&#xff0c;用作Linux内核代码的管理。在推出后&#x…

GitHub 新手详细教程

这篇文章是我自己写的关于GitHub的内容&#xff0c;从我刚听到这个直到设置成功每一步都有详细的步骤来解释&#xff0c;其中有一些截图或者代码来自于网上。 在开始前先跟大家说一下这篇博客是来介绍桌面版GitHub的使用的&#xff0c;如果只是简单的想使用GitHub新手可以使用…