Java过滤器和监听器

1. 过滤器

1.1. 过滤器

使用baseServlet的优点:方便进行乱码的统一处理,但是如果不使用servlet,在进行中文乱码处理时就需要在每个servlet中书写,比较麻烦
问题:重复的代码在项目中多次使用书写
解决:过滤器
在这里插入图片描述

  • 过滤器也是运行到服务器端的程序
  • 过滤器是到达目标资源之前的预处理操作
  • 过滤器是离开服务器之前的处理程序
  • 多个过滤器可以组合使用,构成过滤器链

1.2. 使用过滤器解决乱码

public class EncFilter implements Filter {// 初始化方法-执行一次String abc;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// UTF-8abc = filterConfig.getServletContext().getInitParameter("abc");}// 服务请求方法-执行多次@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 到达目标资源之前的处理操作servletRequest.setCharacterEncoding(abc);// 执行下一个过滤器或目标资源filterChain.doFilter(servletRequest, servletResponse);// 离开服务器之前的处理操作}// 销毁-执行一次@Overridepublic void destroy() {}
}
	<context-param><param-name>abc</param-name><param-value>utf-8</param-value></context-param><filter><filter-name>EncFilter</filter-name><filter-class>com.wyb.filter.EncFilter</filter-class></filter>

1.3. 使用过滤器进行登陆的控制

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) resp;Object emp = request.getSession().getAttribute("emp");String uri = request.getRequestURI();String queryString = request.getQueryString();System.out.println("uri: " + uri + " queryString: " + queryString);if ("/wyboa/login.jsp".equals(uri) || "/wyboa/servlet/EmployeeServlet?method=empLogin".equals(uri + "?" + queryString)) {filterChain.doFilter(request, response);} else {if (emp == null) {// 用户没有登陆response.sendRedirect(request.getContextPath() + "/login.jsp");} else {// 直接方形-执行目标资源filterChain.doFilter(request, response);}}
}

1.4. 过滤器更多内容

在这里插入图片描述
Q1: 多个过滤器,执行顺序怎么确定?
A1: <filter-mapping>的顺序确定执行的顺序
Q2: 每个请求和响应都要经过过滤器吗?
A2: 不是,是否经过过滤器,经过几个过滤器,由过滤器的路径来定<url-pattern>/servlet/*</url-pattern> <url-pattern>/*</url-pattern>
Q3: 请求和响应时是否分别将过滤器代码从头到尾执行一遍?
A3: 不是,请求时执行预处理操作,响应时执行处理操作,请求时过滤器执行顺序如果:1、2、4,响应时过滤器执行顺序:4、2、1
Q4: 在过滤器中能否跳转到项目的其他任意资源
A4: 如果一个过滤器是进行权限验证的,没有登陆,就不可以访问目标资源,直接跳转到login.jsp
Q5: 重定向和转发是否经过过滤器
A5: 重定向不经过,默认转发不经过,因为是服务器端跳转,可以通过配置解决

2. 监听器实现日志记录

2.1. 监听器

监听器:监听事件,处理事件的对象,使用观察者设计模式实现的
观察者设计模式分为三个角色:事件源、事件、监听器

  • 事件源:发生事情的根源,触发事件的资源(对象)(发生事件的场所)
  • 事件:发生的事情,包含事件源
  • 监听器:处理事件的逻辑,根据事件获取事件源,并处理事件
    在这里插入图片描述
public class LogListener implements ServletRequestListener {// 监听请求销毁@Overridepublic void requestDestroyed(ServletRequestEvent sre) {}// 监听请求的发出@Overridepublic void requestInitialized(ServletRequestEvent sre) {// xxx在xxx时间访问程序的xx位置ServletRequest servletRequest = sre.getServletRequest();HttpServletRequest request = (HttpServletRequest) servletRequest;// 获得远程访问的IP地址String ip = request.getRemoteAddr();// 获得访问的时间String localeString = new Date().toLocaleString();// 程序的位置 servlet/uu?method=addString requestURI = request.getRequestURI();String queryString = request.getQueryString();try {PrintWriter out = new PrintWriter(new FileWriter("D:/log.txt", true));System.out.println("用户:" + ip + ".在:" + localeString + ",访问了程序:" + requestURI + "?" + queryString);out.close();} catch (IOException e) {e.printStackTrace();}}
}

2.2. 监听器实现在线人数统计

public class OnlineListener implements HttpSessionListener, HttpSessionAttributeListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {ServletContext application = se.getSession().getServletContext();Integer online = (Integer) application.getAttribute("online");if (online == null) {online = 0;} else {online--;}application.setAttribute("online", online);}@Overridepublic void attributeAdded(HttpSessionBindingEvent se) {if ("emp".equals(se.getName())) {// 全局对象ServletContext application = se.getSession().getServletContext();// 获得当前在线人数Integer online = (Integer) application.getAttribute("online");if (online == null) {// 当前没人登陆online = 1;} else {// 当前有人登陆online++;}// 把记录的值重新设置到applicationapplication.setAttribute("online", online);}}@Overridepublic void attributeRemoved(HttpSessionBindingEvent se) {}@Overridepublic void attributeReplaced(HttpSessionBindingEvent se) {}
}

2.3. 其他监听器的使用

/** 参考地址:https://blog.csdn.net/kiven_wolf/article/details/77648667* HttpSessionBindingListener*  监听对象从session上进行绑定和解绑*  如果指定的对象绑定到session上,会执行valueBound*  如果对象从session中解绑或session注销,会执行valueUnbound* 注意:使用这个监听时,不需要在web.xml中进行配置* */
public class voidBound implements HttpSessionBindingListener {@Overridepublic void valueBound(HttpSessionBindingEvent event) {}@Overridepublic void valueUnbound(HttpSessionBindingEvent event) {}
}
/** 如果想要实现序列化和反序列化,就需要在Context.xml中配置* 如果对象想要实现序列化过程,对象上必须实现Serializable* */
public class Customer implements HttpSessionActivationListener, Serializable {@Overridepublic void sessionDidActivate(HttpSessionEvent se) {}@Overridepublic void sessionWillPassivate(HttpSessionEvent se) {}
}

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

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

相关文章

2024 第七届“巅峰极客”网络安全技能挑战赛初赛 Web方向 题解WirteUp

EncirclingGame 题目描述&#xff1a;A simple game, enjoy it and get the flag when you complete it. 开题&#xff0c;前端小游戏&#xff0c;红点出不去就行 直接玩通关了 看看如何不玩也能拿到flag&#xff0c;flag存储在后端php文件内&#xff0c;前端找不到。 看一下…

【原创】java+springboot+mysql校园二手商品交易网设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

【MySQL】MySQL基础

目录 什么是数据库主流数据库基本使用MySQL的安装连接服务器服务器、数据库、表关系使用案例数据逻辑存储 MySQL的架构SQL分类什么是存储引擎 什么是数据库 mysql它是数据库服务的客户端mysqld它是数据库服务的服务器端mysql本质&#xff1a;基于C&#xff08;mysql&#xff09…

QT 编译报错:C3861: ‘tr‘ identifier not found

问题&#xff1a; QT 编译报错&#xff1a;C3861&#xff1a; ‘tr’ identifier not found 原因 使用tr的地方所在的类没有继承自 QObject 类 或者在不在某一类中&#xff0c; 解决方案 就直接用类名引用 &#xff1a;QObject::tr( )

【舍入,取整,取小数,取余数丨Excel 函数】

数学函数 1、Round函数 Roundup函数 Rounddown函数 取整&#xff1a;(Int /Trunc)其他舍入函数&#xff1a; 2、Mod函数用Mod函数提取小数用Mod函数 分奇偶通过身份证号码判断性别 1、Round函数 Roundup函数 Rounddown函数 Round(数字&#xff0c;保留几位小数)&#xff08;四…

SOEX从去中心化的链上社交关系到创收策略

是时候摆脱传统的在线社区&#xff0c;真正进入 Web3 了&#xff0c;利用区块链的力量&#xff0c;并理解社交互动的意义远不止分享内容或复制交易。代币化将赋能参与提升到一个全新的水平&#xff0c;并带来一系列新的机会。 社交网络可以发挥强大的作用&#xff0c;尤其是从…

Android的logcat日志详解

Android log系统 logcat介绍 logcat是android中的一个命令行工具&#xff0c;可以用于得到程序的log信息。下面介绍 adb logcat中的详细参数命令以及如何才能高效的打印日志&#xff0c;或把日志保存到我们指定的位置。 可以输入 adb logcat --help&#xff0c;查看一下一些简…

VMware vSphere5.0关闭虚拟机电源时,报错从ESXI主机接收到错误

ESXI和VCENTER都是5.0版本的&#xff0c;有台虚拟机关机报错提示从ESXI主机接受到意外错误 具体报错信息如下&#xff1a; 从VCENTER平台对该虚拟机做任何操作都无法生效&#xff0c;后来查看了虚拟机的网络和端口&#xff0c;发现SSH能正常联通&#xff0c;进入虚拟机后使用命…

【云原生】docker 部署 Doris 数据库使用详解

目录 一、前言 二、数据分析概述 2.1 什么是数据分析 2.2 数据分析目的和意义 2.3 数据分析常用的技术和工具 2.3.1 编程语言 2.3.2 数据处理和分析库 2.3.3 数据可视化工具 2.3.4 数据库系统 2.3.5大数据处理框架 2.3.6 云服务和平台 2.3.7 其他工具 三、Doris介绍…

gdb中使用python脚本

1、入门案例 首先有1个a.cpp&#xff0c;代码如下&#xff1a; #include <map> #include <set> #include <iostream> #include <string>using namespace std;struct MyStruct {std::string mName;std::map<int, std::string> mField1;std::set…

51单片机的无线病床呼叫系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温湿度传感器模块矩阵按键时钟模块等模块构成。适用于病床呼叫系统、16床位呼叫等相似项目。 可实现基本功能: 1、LCD1602实时显示北京时间、温湿度信息、呼叫床位等信息&#xff1b; 2、DHT11采集病房温湿度信息&…

深度学习的发展历程

深度学习的起源 在机器学习中&#xff0c;我们经常使用两种方式来表示特征&#xff1a;局部表示&#xff08;Local Representation&#xff09;和分布式表示&#xff08;Distributed Representation&#xff09;。以颜色表示为例&#xff0c;见下图&#xff1a; 要学习到一种好…

iPhone手机清理软件:照片清理功能全解析

在数字化生活中&#xff0c;智能手机成为我们记录生活点滴的主要工具&#xff0c;尤其是iPhone&#xff0c;以其卓越的相机功能备受用户青睐。然而&#xff0c;成千上万的照片迅速堆积&#xff0c;不仅占用了大量存储空间&#xff0c;还使得设备运行缓慢。在众多解决方案中&…

【数据分享】《中国城市统计年鉴》(1985-2023)全PDF版本 第一次补档

数据介绍 中国城市&#xff0c;如同一本生动的历史书&#xff0c;承载着经济、社会的快速变迁。《中国城市统计年鉴》记录了城市的发展轨迹&#xff0c;是我们理解城市化进程、洞察城市挑战的重要指南。 这份年鉴的数据庞大而详实&#xff0c;囊括了中国城市发展的多个方面。…

船舶机械设备5G智能工厂物联数字孪生平台,推进制造业数字化转型

船舶机械设备5G智能工厂物联数字孪生平台&#xff0c;推进制造业数字化转型。在当今数字化浪潮推动下&#xff0c;船舶制造业正经历着前所未有的变革。为了应对市场的快速变化&#xff0c;提升生产效率&#xff0c;降低成本&#xff0c;并增强国际竞争力&#xff0c;船舶机械设…

海底生物检测-目标检测数据集(包括VOC格式、YOLO格式)

海底生物检测-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Kp4Reqt4tq1IafVF33IrnA?pwddxbv 提取码&#xff1a;dxbv 数据集信息介绍&#xff1a; 共有 7383 张图像和一一对应的标注文件 标…

仕考网:事业编考试考什么?

事业编考试科目为&#xff1a; 《职测》《综应》《公基》三选二 事业编有哪些招考形式? ①联考 多省份统一考试&#xff0c;考试时间、考试内容相同&#xff0c;每年两次&#xff0c;上半年5月和下半年10月各一次; ②单招 用人单位单独招聘&#xff0c;考试时间和内容自…

js原型与原型链详解(万文总结,一文搞懂原型链!)

目录 一&#xff0c;原型 1&#xff0c; 对象 2&#xff0c;原型&#xff08;原型对象&#xff09; 二&#xff0c;隐式原型__proto__ 1&#xff0c;__proto__ 2&#xff0c;考你一下 三&#xff0c;原型链 1&#xff0c;Object.prototype 2&#xff0c;链 四&#xff0c;练…

C++第四十七弹---深入理解异常机制:try, catch, throw全面解析

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1.C语言传统的处理错误的方式 2.C异常概念 3. 异常的使用 3.1 异常的抛出和捕获 3.2 异常的重新抛出 3.3 异常安全 3.4 异常规范 4.自定义…

OpenCV结构分析与形状描述符(8)点集凸包计算函数convexHull()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 查找一个点集的凸包。 函数 cv::convexHull 使用斯克拉斯基算法&#xff08;Sklansky’s algorithm&#xff09;来查找一个二维点集的凸包&#…