JavaWeb学习:在SSM框架中配置一个简单的监听器和过滤器

实现效果:

编写一个记录有多少个请求访问的监听器,通过面向全部访问路径的过滤器更新监听器中的visitCount次数。

监听器:


@WebListener
public class VisitCounterListener implements ServletContextListener {private static final String VISIT_COUNT_ATTRIBUTE = "visitCount";@Overridepublic void contextInitialized(ServletContextEvent sce) {// Web应用启动时初始化访问次数为0sce.getServletContext().setAttribute(VISIT_COUNT_ATTRIBUTE, 0);}@Overridepublic void contextDestroyed(ServletContextEvent sce) {}// 增加一个用于增加访问次数的方法,这将在过滤器中被调用public static void incrementVisitCount(ServletContext servletContext) {Integer visitCount = (Integer) servletContext.getAttribute(VISIT_COUNT_ATTRIBUTE);if (visitCount == null) {visitCount = 0;}servletContext.setAttribute(VISIT_COUNT_ATTRIBUTE, visitCount + 1);System.out.println("访问次数:" + visitCount);}// 提供一个获取当前访问次数的方法,供其他组件使用public static int getVisitCount(ServletContext servletContext) {Integer visitCount = (Integer) servletContext.getAttribute(VISIT_COUNT_ATTRIBUTE);return visitCount != null ? visitCount : 0;}
}

注意!一定要加上@WebListener注解!在WebConfig配置类中声明listener的bean组件好像没有用,只有通过注解才能正确注入容器。

过滤器:


@WebFilter(filterName = "VisitCounterFilter", urlPatterns = "/*")
public class VisitCounterFilter implements Filter {private static final Logger logger = Logger.getLogger(VisitCounterFilter.class.getName());@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("VisitCounterFilter初始化...");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 强制类型转换为HttpServletRequest,因为我们知道在Web应用中通常处理的是HTTP请求HttpServletRequest httpRequest = (HttpServletRequest) request;ServletContext servletContext = httpRequest.getServletContext();// 在请求处理之前增加访问次数VisitCounterListener.incrementVisitCount(servletContext);// 打印访问次数logger.info("VisitCounterFilter.doFilter start"); // 进入过滤器时记录日志System.out.println("访问次数:" + VisitCounterListener.getVisitCount(servletContext));logger.info(VisitCounterListener.getVisitCount(servletContext) + "");// 继续过滤器链chain.doFilter(request, response);logger.info("VisitCounterFilter.doFilter end"); // 离开过滤器时记录日志}@Overridepublic void destroy() {System.out.println("VisitCounterFilter销毁");}
}

注意:同样的!需要使用@WebFilter注解并声明相关信息!/*则说明对所有请求进行过滤

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

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

相关文章

经常用到的代码段

opencv opencv-图像部分 opencv显示图像 cv2.namedWindow("just for test", 0) cv2.imshow("just for test", index_img) cv2.waitKey(0)Opencv转PIL.Image Image.fromarray(cv2.cvtColor(cv_img,cv2.COLOR_BGR2RGB)) PIL.Image转Opencv cv2.cvtColor(…

chatgpt :怎样学c 指针

现在的感觉,要想学好程序,必须要想法能使用ChatGPT这个工具,它比任何老师和书籍都有用。比Google搜索都强。它给你的答案非常全面,可以作为全面知识的总结。 学习C语言中的指针可以提高你的编程能力和理解计算机内存管理的知识。…

CSAPP Lab08——Proxy Lab完成思路

蓝色的思念 突然演变成了阳光的夏天 空气中的温暖不会很遥远 ——被风吹过的夏天 完整代码见:CSAPP/proxylab-handout at main SnowLegend-star/CSAPP (github.com) Q:计算机网络中port的作用是什么? A:在计算机网络中&#xff…

qt中实现多语言功能

qt中实现多语言功能 原理: 其本质就是生成ts文件,然后使用Linguist软件手工翻译,再生成qm文件,最后在主程序的开始加载不同的qm文件,实现多语言。 步骤: 修改程序文件 在pro文件中加入说明 TRANSLATI…

Socket网络通讯入门(一)

提示:能力有限,不足以及错误之处还请指出! 文章目录 前言一、 计算机网络 OSI、TCP/IP、五层协议 体系结构1.OSI七层模型每层的作用2.TCP/IP协议分成3.五层协议体系结构 二、Socket服务端和客户端 简单通信1.服务端代码2.客户端 总结 前言 简…

游戏软件与应用软件的区别

游戏软件和应用软件在功能、目标用户、使用场景以及设计理念上存在显著区别。以下是详细的比较: 功能和目的 游戏软件 娱乐性:游戏软件的主要目的是提供娱乐和休闲体验,用户通过互动、挑战和成就感获得乐趣。 交互性:通常具有…

vs - 在win10中安装vs2013update5

文章目录 vs - 在win10中安装vs2013update5概述笔记直接安装vs2013-update5报错先安装vs2013原版安装 vs2013 update5测试备注END vs - 在win10中安装vs2013update5 概述 用VS2019写的程序,在早期windows(e.g. win7, win8.1)上安装时,需要UCRT。 UCRT是…

SpringBoot整合jasypt加密配置文件敏感信息

SpringBoot整合jasypt加密配置文件敏感信息 在项目中我们需要对配置文件的一些敏感信息进行加密处理,比如数据库账户密码,避免直接暴露出来,这种场景常常用于生产环境,我们不想让开发人员知道生产库的密码,有运维人员…

mysql中一个字段查看有没有重复的值用DISTINCT函数,查看两个字段有没有重复的值用那个函数实例?

在MySQL中,如果你想要查看一个字段中是否有重复的值,你通常会使用DISTINCT来列出所有不重复的值,然后比较返回的行数是否与原始表的行数相同。如果不同,那么就存在重复的值。 但是,如果你想要查看两个字段的组合是否有…

Aws EKS 技术文章

官网 https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/delete-cluster.html eksctl 官网 https://eksctl.io/usage/vpc-networking/ 指定vpc网段 ##### ## eksctl create cluster -f cluster.yml ### cluster.yml apiVersion: eksctl.io/v1alpha5 kind: Cluster…

基础篇01——SQL的基本语法和分类

MySQL数据库安装与基本使用 安装教程参见:通过zip安装MySQL 通过命令行启动和停止MySQL服务命令 前提:安装MySQL成功之后 启动服务:net start mysql 停止服务:net stop mysql 通过命令行连接mysql 可以通过mysql的客户端命令行…

入手戴尔R720,通过iDRAC查看系统信息

想入手服务器很久了,一直担心功耗太高,今天狠心搞了一台戴尔服务器R720。 需求 开虚拟机,核心数要多 学习以下 Windows云桌面AD域控office online serverubuntu试验机 随便折腾不怕玩坏 最好两个网口以上 稳定 四个以上硬盘位 ‍ 为什么是…

在AutoDL上部署百川2大模型

在AutoDL上部署百川2大模型 AUTO DL相关 官网地址 选择容器实例 租用新实例 选择配置 我这里选择3090 , 硬盘尽量选择可以扩容的 , CUDA版本尽量高一点 选择镜像 先将机器关机 先扩容一下数据盘 50G就可以了 然后选择无卡模式开机 因为无卡模式下开机费用会变低 使用JupyterL…

1.3Java对象和类

Java作为一种面向对象语言。支持以下基本概念: 多态继承封装抽象类对象实例方法重载 本节我们重点研究对象和类的概念。 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一条狗是一个…

element-plus 使el-dropdown只显示当前选择节点

在数据对象中设置一个唯一标识符currentDrop,用来存放当前打开的下拉菜单的下标,初始化为null: data() { return { currentDrop: null }; }, 在每个el-dropdown-item上使用visible-change方法,当下拉菜单的状态发生变化时&#…

深入理解Java反射

Java反射(Reflection)是一种强大的机制,它允许在运行时检查和操作类、方法、字段等信息。反射提供了动态性和灵活性,使得应用程序可以在运行时动态加载和操作类。本篇博客将详细讲解Java反射的概念、使用方法和注意事项&#xff0…

BrainGPT1,一个帮你b站点歌放视频的多模态多轮对话模型

BrainGPT1,一个帮你b站点歌放视频的多模态多轮对话模型 返回论文目录 项目地址 模型地址 作者:华东师范大学,计算机科学与技术学院,智能教育研究院的小怪兽会微笑。 介绍 BrainGPT1是一个工具调用多轮对话模型,与G…

免费实现网站HTTPS访问

HTTPS(Hypertext Transfer Protocol Secure)是一种基于SSL协议的HTTP安全协议,旨在为客户端(浏览器)与服务器之间的通信提供加密通道,确保数据在传输过程中的保密性、完整性和身份验证。与传统的HTTP相比&a…

MySQL优化器的SQL重写规则

MySQL优化器的SQL重写规则 MySQL优化器的SQL重写规则&#xff1a;MySQL优化器会根据一定的规则对输入的SQL在保证含义不变的情况下进行SQL的优化重写。 1. 条件简化 1.1 移除不必要的括号 例如&#xff1a; ((a 5 AND b c) OR ((a > c) AND (c < 5))); --优化后 (a…

【数据结构与算法(C 语言)】栈的基本操作函数(动图演示) 及 栈的实际应用之一:进制转换

目录 1. 前言2. 结构及基本操作函数&#xff1a;2.1 栈的结构类型 Stack2.2 初始化栈 InitStack2.3 销毁栈 DestroyStack2.4 清空栈 ClearStack2.5 判断栈是否为空 StackEmpty2.6 获取stack的长度 StackLength2.7 获取栈顶元素 GetTop2.8 入栈 Push2.9 出栈 Pop2.10 访问元素2.…