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.hqwc.cn/news/587574.html

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

相关文章

达梦数据库 优化

谁进行优化&#xff1f;优化什么&#xff1f; 优化不能仅从数据库方面考虑&#xff0c;比如&#xff0c;在存储达到数据库极限、应用涉及人员设计的代码稀巴烂的情况下&#xff0c;进行调优就是杯水车薪的效果。 涉及到优化人员&#xff1a; 数据库管理员应用程序架构师应用…

element-ui result 组件源码分享

今日简单分享 result 组件的源码实现&#xff0c;主要从以下三个方面&#xff1a; 1、result 组件页面结构 2、result 组件属性 3、result 组件 slot 一、result 组件页面结构 二、result 组件属性 2.1 title 属性&#xff0c;标题&#xff0c;类型 string&#xff0c;无默…

图神经网络:处理非欧几里得数据的新视角

目录 1. 引言 2.图数据与图神经网络基础 3.GNN模型详解 4.应用案例 4.1. 社交网络分析 4.2. 化学分子性质预测 5.总结 1. 引言 非欧几里得数据指的是那些不遵循传统欧几里得空间几何规则的数据。在欧几里得空间中&#xff0c;数据点之间的距离和形状可以通过标准的几何度…

ubuntu-server部署hive-part3-安装mysql

参照 https://blog.csdn.net/qq_41946216/article/details/134345137 操作系统版本&#xff1a;ubuntu-server-22.04.3 虚拟机&#xff1a;virtualbox7.0 部署mysql 下载上传 下载地址 https://downloads.mysql.com/archives/community/ 以root用户上传&#xff0c;/usr/loc…

JavaEE 初阶篇-深入了解单例模式(经典单例模式:饿汉模式、懒汉模式)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 单例模式的概述 2.0 单例模式 - 饿汉式单例 2.1 关于饿汉式单例的线程安全问题 3.0 单例模式 - 懒汉式单例 3.1 关于懒汉式单例的线程安全问题 3.1.1 加锁 synchr…

【C++】排序算法 --快速排序与归并排序

目录 颜色分类&#xff08;数组分三块思想&#xff09;快速排序归并排序 颜色分类&#xff08;数组分三块思想&#xff09; 给定⼀个包含红⾊、⽩⾊和蓝⾊、共 n 个元素的数组 nums &#xff0c;原地对它们进⾏排序&#xff0c;使得相同颜⾊ 的元素相邻&#xff0c;并按照红⾊、…

【Servlet】服务器内部转发以及客户端重定向

文章目录 一、服务器内部转发&#xff1a;request.getRequestDispatcher("...").forward(request, response);二、客户端重定向&#xff1a;response.sendRedirect("");三、服务器内部转发代码示例四、客户端重定向代码示例 一、服务器内部转发&#xff1a…

卡尔曼滤波笔记

资料&#xff1a;https://www.zhihu.com/question/47559783/answer/2988744371 https://www.zhihu.com/question/47559783 https://blog.csdn.net/seek97/article/details/120012667 一、基本思想 在对一个状态值进行估计的时候&#xff0c;如果想测量值更准&#xff0c;很自然…

【Vue3源码学习】— CH2.7 Computed: Vue 3 计算属性深入解析

Computed: Vue 3 计算属性深入解析 1.计算属性的基本用法2. ComputedRefImpl 类深入解析JavaScript 中的 getter 函数 3. 计算属性的创建&#xff1a;computed 方法解析3.1 源码解析3.2 使用示例 4. 计算属性的工作原理5. 手动实现简化的计算属性6. 结语 在 Vue 3 的响应式系统…

【Go】二十、反射

文章目录 1、反射2、对基本数据类型反射3、对结构体进行反射4、获取变量的类别5、通过反射修改基本类型变量的值6、通过反射操作结构体的属性和方法 1、反射 //核心包 import ("reflect")通过反射&#xff1a; 可以在运行时动态获取变量的类型、获取结构体的信息&a…

mac mini m1芯片 Xcode 15.3 各种报错的问题

错误一&#xff1a; /Users/mac/Desktop/Test_project/mobile-ios/Test/Test-Bridging-Header.h:4:9 failed to emit precompiled header /Users/mac/Library/Developer/Xcode/DerivedData/App-apvcgkuclncgfqdlzqcoffyaexos/Build/Intermediates.noindex/PrecompiledHeaders/…

谷粒商城实战(008 缓存)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第151p-第p157的内容 简介 数据库承担落盘&#xff08;持久化&#xff09;工作 拿map做缓存 这种是本地缓存&#xff0c;会有一些问题 分布…