javaweb学习(day11-监听器Listener过滤器Filter)

一、监听器Listener

1 Listener介绍

  • Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 序、Listener 监听器、Filter 过滤器
  • Listener JavaEE 的规范,就是接口
  • 监听器的作用是,监听某种变化(一般就是对象创建/销毁, 属性变化), 触发对应方法完成 相应的任务
  • JavaWeb 中的监听器(共八个), 目前最常用的是 ServletContextListener

ServletContextListener 监听器 

2.1 作用 

        监听 ServletContext 创建或销毁 ( 当我们 Web 应用启动时 ,就会创建 ServletContext)
即生命周期监听,应用场景 (1) 加载初始化的配置文件;比如 spring 的配置文件 (2) 任务调
度(配合定时器 Timer/TimerTask)

2.2 相关方法

2.3 应用实例 

package com.hspedu.listener;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;public class HspServletContextListener implements ServletContextListener {/*1. 当一个类实现了ServletContextListener时,该类就是一个监听器2. 该类可以监听的事件 由该类实现的监听接口决定3. 比如实现了ServletContextListener 则该类就可监听ServletContext对象的创建和销毁。以此类推4.HspServletContextListener就是一个监听者5.当web应用启动时,就会产生一个ServletContextEvent的事件,会调用监听器的对应事件处理方法6. contextInitialized同时会传递事件对象7. 程序员可以通过ServletContextEvent事件对象来获取需要的信息,再进行业务处理8.tomcat怎么知道这个监听器的存在?因为我们需要在web.xml配置*/@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {ServletContext servletContext =servletContextEvent.getServletContext();System.out.println("监听到了"+servletContext+"被创建");}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {ServletContext servletContext =servletContextEvent.getServletContext();System.out.println("监听到了"+servletContext+"被销毁");}
}

 2.4 配置 web.xml

ServletContextAttributeListener 监听器 

3.1 介绍 

作用:监听 ServletContext 属性变化
相关方法

3.2 案例

 创建ServletContextAttributeListener

package com.hspedu.listener;import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;public class MyServletContextAttributeListener implements ServletContextAttributeListener {@Overridepublic void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println("添加了 servletContext 属性名= " + servletContextAttributeEvent.getName() + " 属 性 值 =" +servletContextAttributeEvent.getValue());}@Overridepublic void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {System.out.println("删除了 servletContext 属性名= " + servletContextAttributeEvent.getName() + " 属 性 值 =" +servletContextAttributeEvent.getValue());}@Overridepublic void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {//拿到的属性是修改之前的System.out.println("替换了 servletContext 属性名= " + servletContextAttributeEvent.getName() + " 属 性 值 =" +servletContextAttributeEvent.getValue());}
}
配置 web.xml

创建Servlet

package com.hspedu.servlet;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class HiServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//给ServletContext添加相关的属性ServletContext servletContext =request.getServletContext();servletContext.setAttribute("name","linran");servletContext.setAttribute("name","lin");servletContext.removeAttribute("name");System.out.println("HoServlet 处理完毕");}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}

 4 其它监听器

4.1 HttpSessionListener 监听器

作用:监听 Session 创建或销毁,即生命周期监听

相关方法

4.2 HttpSessionAttributeListener 监听器 

作用:监听 Session 属性的变化
相关方法

  4.3 ServletRequestListener 监听器

 作用:监听 Request 属性变化

 相关方法

 4.4  ServletRequestListener 监听器

作用:监听 Request 创建或销毁,即 Request 生命周期监听

相关方法

可以用来监控, 某个 IP 访问我们网站的频率, 日志记录 ,访问资源的情况 

二、过滤器 Filter 

Filter 过滤器说明

1.1 为啥要过滤器

1.2 过滤器介绍 

  • Filter 过滤器它是 JavaWeb 的三大组件之一(Servlet 程序、Listener 监听器、Filter 滤器)
  • Filter 过滤器是 JavaEE 的规范,是接口
  • Filter 过滤器它的作用是:拦截请求,过滤响应。 

1.3 应用场景 

权限检查 日记操作  事务管理

Filter 过滤器基本原理

Filter 过滤器快速入门

3.1 需求

web 工程下,有后台管理目录 manage ,要求 该目录下所有资源 html 、图片、
jsp Servlet 等)用户登录后才能访问

 

 3.2 login.jsp

<%--User: LinranDate: 2024/4/2Time: 16:44Version: 1.0To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>管理后台登录</title>
</head>
<body><h1>管理后台登录</h1><form action="<%=request.getContextPath()%>/loginCheckServlet" 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>

 3.3 LoginCLServlet

package com.hspedu.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class LoginCheckServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取用户名和密码//假设密码是123456就可以通过String username=request.getParameter("username");String password=request.getParameter("password");if("123456".equals(password)){//加入sessionHttpSession session = request.getSession();session.setAttribute("username",username);session.setAttribute("password",password);request.getRequestDispatcher("/manage/admin.jsp").forward(request,response);}else {request.getRequestDispatcher("/login.jsp").forward(request,response);}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}

3.4 admin.jsp

<%--User: LinranDate: 2024/4/2Time: 16:48Version: 1.0To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>后台管理</title><base href="<%=request.getContextPath()%>/manage/">
</head>
<body><h1>后台管理</h1><a href="#"> 用户列表</a>||<a href="#">添加用户</a>||<a href="#">删除用户</a><hr>
<img src="1.jpeg">
</body>
</html>

3.5 ManageFilter

package com.hspedu.filter;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class ManageFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {//当Tomcat 创建filter后会调用该方法进行初始化System.out.println("ManageFilter init 被调用.....");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//当每次调用该filter时,dofilter就会被调用System.out.println("ManageFilter doFilter 被调用");//如果这里没有调用继续请求的方法,则停止在这//如果继续访问目标资源//在调用过滤器之前,request对象已经被创建并封装//所以这里就可以通过servletRequest来获取很多信息,比如访问的url\session\数据HttpServletRequest httpServletRequest =((HttpServletRequest) servletRequest);HttpSession session = httpServletRequest.getSession();//获取username session对象Object username = session.getAttribute("username");if(username!=null){//用户登录过,直接放行filterChain.doFilter(servletRequest,servletResponse);//继续访问目标资源//servletRequest,servletResponse会传递给目标资源//}else {servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);}}@Overridepublic void destroy() {//当filter被销毁时,就会调用该方法System.out.println("ManageFilter destroy 被调用");}
}

3.6 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--filter一般写在最前面1. 我们可以发现filter配置和servlet是十分相似的,filter也是被tomcat管理和维护的2. url-pattern就是当请求的url和匹配的时候,就会调用该filter‘3. /manage/* 第一个/解析成http://ip:port/工程路径4:完整的路径就是http://ip:port/工程路径/manage/* 当请求的资源url满足该条件时都会调用filter--><filter><filter-name>ManageFilter</filter-name><filter-class>com.hspedu.filter.ManageFilter</filter-class></filter><filter-mapping><filter-name>ManageFilter</filter-name><url-pattern>/manage/*</url-pattern></filter-mapping><servlet><servlet-name>LoginCheckServlet</servlet-name><servlet-class>com.hspedu.servlet.LoginCheckServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginCheckServlet</servlet-name><url-pattern>/loginCheckServlet</url-pattern></servlet-mapping></web-app>

Filter 过滤器 url-pattern

  • url-pattern : Filter 的拦截路径, 即浏览器在请求什么位置的资源时,过滤器会进行拦截过
  • 精确匹配 <url-pattern>/a.jsp</url-pattern> 对应的 请求地址 http://ip[域名]:port/工程路径/a.jsp 会拦截
  • 目录匹配 <url-pattern>/manage/*</url-pattern>对应的 请求地址 http://ip[域名]:port/工程路径/manage/xx , web 工程 manage 目录下所有资源 会拦截
  • 后缀名匹配 <url-pattern>*.jsp</url-pattern> 后缀名可变,比如 *.action *.do 等等对应的请求地址 http://ip[域名]:port/工程路径/xx.jsp , 后缀名为 .jsp 请求会拦截
  • Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在

Filter 过滤器生命周期 

FilterConfig 

  • FilterConfig Filter 过滤器的配置类 
  • Tomcat 每次创建 Filter 的时候,也会创建一个 FilterConfig 对象,这里包含了 Filter 置文件的配置信息。
  • FilterConfig 对象作用是获取 filter 过滤器的配置内容
package com.hspedu.filter;import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;public class FilterConfig_ implements Filter {/*演示FilterConfig的使用*/@Overridepublic void init(FilterConfig filterConfig) throws ServletException {//通过filterConfig获取相关参数String filterName =filterConfig.getFilterName();System.out.println("filterName="+filterName);String ip =filterConfig.getInitParameter("ip");System.out.println("ip="+ip);ServletContext servletContext =filterConfig.getServletContext();System.out.println("servletContext="+servletContext);Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();while (initParameterNames.hasMoreElements()){System.out.println("名字  :"+initParameterNames.nextElement());}}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {}@Overridepublic void destroy() {}
}

 web.xml

7 FilterChain 过滤器链 

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

 7.1 AFilter

package com.hspedu.filter;import javax.servlet.*;
import java.io.IOException;public class AFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {System.out.println("=======AFilter doFilter()前置处理代码=======");chain.doFilter(req, resp);System.out.println("=======AFilter doFilter()后置处理代码=======");}public void init(FilterConfig config) throws ServletException {}}

 7.2 BFilter

package com.hspedu.filter;import javax.servlet.*;
import java.io.IOException;public class AFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {System.out.println("=======AFilter doFilter()前置处理代码=======");chain.doFilter(req, resp);System.out.println("=======AFilter doFilter()后置处理代码=======");}public void init(FilterConfig config) throws ServletException {}}

7.3 hi.jsp

<%--User: LinranDate: 2024/4/2Time: 20:14Version: 1.0To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>hi</title>
</head>
<body>
<h1>admin 目录下的 hi.jsp</h1>
<h1>后台管理</h1>
<a href="#">用户列表</a>||<a href="#">添加用户</a>||<a href="#">删除用户</a>
<hr/>
</body>
</html>

7.4 web.xml

 

FilterChain 注意事项和细节 

  • 多个 filter 和目标资源在一次 http 请求,在同一个线程中
  • 当一个请求 url filter url-pattern 匹配时, 才会被执行, 如果有多个匹配上,就会顺序执行,形成一个 filter 调用链(底层可以使用一个数据结构搞定
  • 多个 filter 共同执行时,因为是一次 http 请求, 使用同一个 request 对象
  • 多个 filter 执行顺序,和 web.xml 配置顺序保持一致.
  • chain.doFilter(req, resp)方法 将执行下一个过滤器的 doFilter 方法, 如果后面没有过滤器,则执行目标资源。
  • 小结:注意执行过滤器链时, 顺序是(用前面的案例分析) Http请求 -> A 过滤器 dofilter() -> A 过滤器前置代码 -> A 过滤器 chain.doFilter() -> B 过滤器 dofilter() -> B 过滤器前置代 -> B过滤器 chain.doFilter() -> 目标文件 -> B过滤器后置代码 -> A过滤器后置代码 -> 返回给浏览器页面/数据

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XRDP登录ubuntu桌面闪退问题

修改 /etc/xrdp/startwm.sh unset DBUS_SESSION_BUS_ADDRESS unset XDG_RUNTIME_DIR . $HOME/.profile

​如何使用ArcGIS Pro进行洪水淹没分析

洪水淹没分析是一种常见的水文地理信息系统应用&#xff0c;用于模拟和预测洪水事件中可能受到淹没影响的地区&#xff0c;这里为大家介绍一下ArcGIS Pro进行洪水淹没分析的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM数据&…

数据结构(六)——图的应用

6.4 图的应用 6.4.1 最小生成树 对于⼀个带权连通⽆向图G (V, E)&#xff0c;⽣成树不同&#xff0c;每棵树的权&#xff08;即树中所有边上的权值之和&#xff09;也可能不同。设R为G的所有⽣成树的集合&#xff0c;若T为R中边的权值之和最小的生成树&#xff0c;则T称为G的…

怎样把学浪上的视频保存到电脑

怎样把学浪上的视频保存到电脑,这里给大家一个工具,专门用来下载学浪上的视频 这个工具叫做小浪助手.exe 我已经打包好了,有需要的自己取一下 链接&#xff1a;https://pan.baidu.com/s/1y7vcqILToULrYApxfEzj_Q?pwdkqvj 提取码&#xff1a;kqvj --来自百度网盘超级会员V…

【三维重建】3D Gaussian Splatting:实时的神经场渲染

文章目录 摘要一、前言二、相关工作1.传统的场景重建与渲染2.神经渲染和辐射场3.基于点的渲染和辐射场4.*什么是 Tile-based rasterizer (快速光栅化) 三、OVERVIEW四、可微的三维高斯 Splatting五、三维高斯 自适应密度控制的优化1.优化2.高斯的自适应控制 六、高斯分布的快速…

计算机网络—HTTP协议:深入解析与应用实践

​ &#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;ヒステリックナイトガール 1:03━━━━━━️&#x1f49f;──────── 5:06 &#x1f504; ◀️ ⏸ ▶️ ☰…

Photoshop 2024 中文---专业图像处理软件的又一次飞跃

Photoshop 2024是一款功能强大的图像处理软件&#xff0c;广泛应用于创意设计和图像处理领域。它提供了丰富的绘画和编辑工具&#xff0c;包括画笔、铅笔、颜色替换、混合器画笔等&#xff0c;使用户能够轻松进行图片编辑、合成、校色、抠图等操作&#xff0c;实现各种视觉效果…

如何使用极狐GitLab 启用自动备份功能

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何极狐GitLab 自…

利用Node.js实现拉勾网数据爬取

引言 拉勾网作为中国领先的互联网招聘平台&#xff0c;汇集了丰富的职位信息&#xff0c;对于求职者和人力资源专业人士来说是一个宝贵的数据源。通过编写网络爬虫程序&#xff0c;我们可以自动化地收集这些信息&#xff0c;为求职决策和市场研究提供数据支持。Node.js以其非阻…

基于Python的豆瓣电影评分可视化,豆瓣电影评分预测系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【stm32】I2C通信外设

【stm32】I2C通信外设 概念部分 如果简单应用&#xff0c;选择软件I2C。如果对性能指标要求比较高 选择硬件I2C 有硬件电路自动反转引脚电平&#xff0c;软件只需要写入控制寄存器CR和数据寄存器DR 为了实时监控时序的状态&#xff0c;还要读取状态寄存器SR 写入控制寄存器CR…

nodeJs 实现视频的转换(超详细教程)

前段时间拿到一个视频是4k的&#xff0c;没法播放&#xff0c;于是通过 node.js 和 ffmpeg 实现了视频的转换。在win10 系统下实现。 所需工具 node 16.19 直接安装 ffmpeg-5.1.1-essentials_build 解压后重名 ffmpeg 放到C盘 然后配置下环境变量 Git-2.42.0.2-64-bit 直接…

一键更换ip地址命令的应用方法

在数字化时代&#xff0c;IP地址作为网络设备的标识符&#xff0c;其重要性不言而喻。然而&#xff0c;在某些特定场景下&#xff0c;我们可能需要频繁地更换IP地址&#xff0c;如网络爬虫、隐私保护或测试环境等。这时&#xff0c;一键更换IP地址的命令就显得尤为重要。虎观代…

51单片机实验02- P0口流水灯实验

目录 一、实验的背景和意义 二、实验目的 三、实验步骤 四、实验仪器 五、实验任务及要求 1&#xff0c;从led4开始右移 1&#xff09;思路 ①起始灯 &#xff08;led4&#xff09; ②右移 2&#xff09;效果 3&#xff09;代码☀ 2&#xff0c;从其他小灯并向右依…

美易官方:现在不考虑降息,可能需要进一步加息

美联储密集放鹰&#xff1a;现在不考虑降息&#xff0c;可能需要进一步加息 达拉斯联储主席洛根&#xff08;Lorie Logan&#xff09;周五表示&#xff0c;考虑降息还为时过早&#xff0c;理由是近期通胀数据高企&#xff0c;且有迹象显示&#xff0c;借贷成本对经济的拖累可能…

人脸识别:Arcface--loss+code

之前只接触过传统方法的人脸识别算法&#xff0c;本以为基于深度学习的方法会使用对比损失之类的函数进行训练&#xff0c;但是Arcface算法基于softmax进行了创新&#xff0c;本文未深究其详细的loss公式原理&#xff0c;在大致明白其方向下&#xff0c;运行了代码&#xff0c;…

太阳能光伏储能系统:全周期一站式解决方案

随着全球能源结构的不断变革&#xff0c;清洁能源的重要性日益凸显。太阳能光伏储能系统作为一种高效、环保的能源解决方案&#xff0c;正逐渐成为推动能源转型的关键力量。本文将详细介绍太阳能光伏储能系统的全周期一站式解决方案&#xff0c;以期为读者提供全面、深入的了解…

MacOS - brew 和 brew cask 有什么区别?

brew 是 ruby 的包管理&#xff0c;后来看 yangzhiping 的博客介绍了 brew cask&#xff0c;感觉 cask 是更好的关联关系管理&#xff0c;但是&#xff0c;我后来使用过程中&#xff0c;发现很多软件 brew cask 里没有&#xff0c;但是 brew 里面倒是挺多&#xff01;今天来给说…

SpringBoot(48)-使用 SkyWalking 进行分布式链路追踪

Spring Boot&#xff08;48&#xff09;- 使用 SkyWalking 进行分布式链路追踪 介绍 在分布式系统中&#xff0c;了解各个服务之间的调用关系和性能表现是非常重要的。SkyWalking 是一款开源的分布式系统监控与分析平台&#xff0c;能够帮助我们实现分布式系统的链路追踪、性…

Java流操作解析:深度剖析中间操作、终端操作与并行处理机制

文章目录 一、中间操作1.1 过滤&#xff08;filter&#xff09;1.2 映射&#xff08;map&#xff09;1.3 排序&#xff08;sorted&#xff09;1.4 去重&#xff08;distinct&#xff09; 二、 终端操作2.1 收集&#xff08;collect&#xff09;2.2 计数&#xff08;count&#…