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;尤其是从…

文件下载-前端发请求后端返回二进制文件

1.前端发请求&#xff08;axios为例&#xff09; request({url: "/export",method: post,responseType: blob,data: data}).then((response) > {debuggerif (response.type application/json) {alert("设置时间或当前时间暂无数据");} else {const bl…

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;进入虚拟机后使用命…

刷题DAY30

求数列的和 题目&#xff1a;数列的定义如下&#xff1a;数列的第一项为n&#xff0c;以后各项为前一项的平方根&#xff0c;求数列的前m项的和 输入&#xff1a;输入数据有多组&#xff0c;每组占一行&#xff0c;由两个整数n&#xff08;n<10000&#xff09;和m(m<10…

使用i2c子系统驱动i2c oled模块

1、使用linux内核里面的i2c子系统来驱动i2c oled 屏幕 代码如下: #include "linux/i2c.h" #include <linux/module.h> #include <linux/poll.h>#include <linux/fs.h> #include <linux/errno.h> #include <linux/miscdevice.h> #incl…

Python执行cmd命令

在Python中执行cmd命令&#xff0c;可以使用内置的subprocess模块。以下是一个简单的例子&#xff0c;展示如何执行一个cmd命令并获取输出。 import subprocess# 要执行的cmd命令 cmd "dir"# 使用subprocess.run来执行命令 result subprocess.run(cmd, shellTrue,…

【云原生】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…

linux下NTP服务器实战(ntp软件)

linux下NTP服务器实战(ntp软件) 记录linux下NTP服务器搭建及相关管理操作&#xff0c;使用ntp软件包安装部署。 1. NTP服务器搭建实战 借助ntp软件包在linux上搭建ntp服务器,同时作为客户端从上游ntp服务器同步时间。 1.1 安装配置NTP服务器 1.1.1 安装NTP服务 在大多数L…

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

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

验证linux gpu是否可用

通过torch验证 import torchprint(torch.__version__) # 查看torch当前版本号 print(torch.version.cuda) # 编译当前版本的torch使用的cuda版本号 print(torch.cuda.is_available()) # 查看当前cuda是否可用于当前版本的Torch&#xff0c;如果输出True&#xff0c;则表示可…

深度学习的发展历程

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

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

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

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能&#xff0c;来提高自己的 逻辑能力&#xff0c;熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class"box"><dl class"tab"><…