过滤器和监听器

文章目录

    • 01 过滤器的简介
    • 02 使用过滤器进行乱码解决
    • 03 使用过滤器进行登陆的控制
    • 04 过滤器更多内容
    • 05 监听器实现日志记录
    • 06 监听器实现在线人数的统计
    • 07 其他监听器使用

01 过滤器的简介

为什么使用过滤器?

我们目前书写项目中遇到的问题?
A、目前使用的baseServlet的优点就是方便可以进行乱码的统一的处理,但是如果我们以后不使用servlet,那么我们在进行中文乱码处理的时候就需要在每一个servlet 中去书写,但是比较麻烦。
B、在进行登陆拦截处理的时候,我们需要把拦截的代码在每一个页面中重复的书写,这样,就会变的非常的麻烦。

  最终的问题: 重复的代码在项目中多次的使用书写。 解决方案: 过滤器

什么是过滤器?

在这里插入图片描述

02 使用过滤器进行乱码解决

Class文件

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

web.xml 配置过滤范围

<Filtername> </Filtername>
...

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

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+"--"+queryString);
if("/sxtoa/login.jsp".equals(uri)||"/sxtoa/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);}}
}

04 过滤器更多内容

问题1:多个过滤器,执行的顺序怎么确定?

的顺序确定执行的顺序

问题2:每个请求和响应都要经过过滤器吗?

不是,是否经过过滤器,经过几个过滤器由过滤器的路径来定;
/servlet/ /

问题3:请求和响应时是不是分别将过滤器代码从头到尾执行一遍

不是;请求时执行预处理操作,响应时执行后处理操作;
请求时过滤器的执行顺序如果是1,2,4,响应时过滤器的执行顺序4,2,1

问题4:在过滤器中能否跳转到项目的其他任意资源

可以
举例:如果一个过滤器是进行权限验证,没有登录,就不让访问目标资源,直接跳转到login.jsp

问题5:重定向和转发是否经过过滤器

重定向经过
默认转发不经过,因为是服务器端跳转。可以通过配置解决

05 监听器实现日志记录

监听器简介

监听器: 监听事件,处理事件的对象. 使用观察者设计模式实现的.
观察者设计模式: 分为三个角色, 分别是:事件源, 事件, 监听器.
事件: 就是发生的事情, 其中包含事件源
事件源: 发生事情的根源, 触发事件的资源(对象)(发生事件的场所)
监听器: 处理事件的逻辑., 根据事件,获取事件源,并处理事件.
Servlet中的监听器

代码实现

public class LogListener  implements ServletRequestListener {//监听请求销毁@Overridepublic void requestDestroyed(ServletRequestEvent servletRequestEvent) {}//监听请求的发出@Overridepublic void requestInitialized(ServletRequestEvent servletRequestEvent) {// XXX 在  XXX时间  访问  程序的XX位置ServletRequest servletRequest = servletRequestEvent.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));out.println("用户:"+ip+",在:"+localeString+",访问了程序:"+requestURI+"?"+queryString);out.close();} catch (IOException e) {e.printStackTrace();}}
}

06 监听器实现在线人数的统计

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

07 其他监听器使用

@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {System.out.println("valueBound");
}
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {// req.getSession().invalidate();// req.getSession().removeAttribute("emp");System.out.println("valueUnbound");
}
/*** 如果想要实现序列化和反序列化需要在Context.xml中* <Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true"><Store className="org.apache.catalina.session.FileStore" directory="E:\apache-tomcat-7.0.79\webapps"/></Manager>如果对象想要实现序列化过程,对象上必须实现 Serializable** **/
@Override
public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {System.out.println("sessionWillPassivate");
}
@Override
public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {   System.out.println("sessionDidActivate");
}

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

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

相关文章

高启航:秋运会!

本文原创&#xff1a;高启航&#xff08;本文所有收益均归高启航所有&#xff09;在十月份的二十一号&#xff0c;我们济南信息工程学校迎来了一年一度的秋季运动会。这次秋运会&#xff0c;每一个班级所准备的开幕式、训练已久的千人武术大展演、以及在运动会上表现优越的运动…

用python画出吉祥物

大前提 你需要一个"npy" 效果图 源码 # 库的导入 import turtleturtle.title(PythonBingDwenDwen&#xff08;axing&#xff09;) #这里的字我们可以自己进行修改turtle.speed(10) # 速度&#xff0c;如果觉得20快了&#xff0c;你们可以设置10# 左手 turtle.p…

RabbitMQ知多少

1.引言 RabbitMQ——Rabbit Message Queue的简写&#xff0c;但不能仅仅理解其为消息队列&#xff0c;消息代理更合适。RabbitMQ 是一个由 Erlang 语言开发的AMQP&#xff08;高级消息队列协议&#xff09;的开源实现&#xff0c;其内部结构如下&#xff1a; RabbitMQ作为一个…

王宝兴:秋运会

本文原创&#xff1a;王宝兴本文所有收益归王宝兴所有一年一度的运动会如期而至。可谓是“沙场秋点兵”的壮阔&#xff0c;给了我们难以言喻的激情。为了入场式&#xff0c;为了我们每个人&#xff0c;为了我们整个班集体&#xff0c;所有人付出的不止一点&#xff0c;在这短短…

.NET Core快速入门教程 1、开篇:说说.NET Core的那些事儿

一、.NET Core的诞生 聊 .NET Core&#xff0c;就不得不说他的爸爸 .NET。当年Java刚刚兴起&#xff0c;如火如荼&#xff0c;微软也非常推崇Java&#xff0c;当时Windows平台的Java虚拟机就是微软按照JVM标准实现的&#xff0c;据说也是当时性能最好的Java虚拟机。但是微软也…

机器学习和深度学习概念入门

转载自 机器学习和深度学习概念入门 作者&#xff1a;谭东 遵循&#xff1a;BY-SA&#xff08;署名-相同方式共享4.0协议&#xff09; 对于很多初入学习人工智能的学习者来说&#xff0c;对人工智能、机器学习、深度学习的概念和区别还不是很了解&#xff0c;有可能你每天…

lldb 调试 linux下 .net Core 总结及开源扩展 yinuo

相信很多朋友在跟随微软.net core 从windows平台迁移至linux平台的过程中遇到很多别扭的地方&#xff0c;这里我只聊聊 运行时 调试的那些事儿。 首先从工具上来讲Windows上的windbg肯定是运行时的首选调试工具(因为有对应版本的SOS.dll)&#xff0c;在linux平台运行时调试需要…

班级日常分享:一天一瞬间!

好久没有记录班级日常了&#xff0c;自运动会结束之后&#xff0c;事情比较多&#xff0c;也很忙&#xff0c;所以没有及时记录。19级3班最近在上bootstrap&#xff0c;属于前端的范畴&#xff0c;内容较简单&#xff0c;同学们都能跟的上老师的步伐&#xff0c;一行一行大代码…

Java 程序员必须掌握的 8 道数据结构面试题,你会几道

转载自 Java 程序员必须掌握的 8 道数据结构面试题&#xff0c;你会几道 瑞士计算机科学家Niklaus Wirth在1976年写了一本书&#xff0c;名为《算法数据结构编程》。 40多年后&#xff0c;这个等式仍被奉为真理。这就是为什么在面试过程中&#xff0c;需要考察软件工程师对数…

vue.js 01 模板语法

文章目录vue插值vue指令vue插值 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&…

如何使用bootstrap实现轮播图?

大家好&#xff0c;我是雄雄&#xff0c;今天给大家分享的是如何使用bootstrap实现轮播图&#xff0c;美观大方且兼容性还好&#xff01;轮播图就不做过多的介绍了&#xff0c;大家都知道&#xff0c;只是轮播的实现有多种方式&#xff0c;例如使用纯js写&#xff0c;费时费力&…

Visual Studio Code: 利用 MSSQL 插件创建数据库 IDE

尽管面对繁重的 .NET 开发任务 Visual Studio 仍是我的首选 IDE&#xff0c;但我却已深深迷恋上 Visual Studio Code (VS Code)&#xff0c;无论我使用的语言是 C#、JavaScript 还是 Node&#xff0c;也无论我使用的操作系统是 Windows 还是 macOS。 当然&#xff0c;VS Code 及…

binarySearch与IndexOf的那些事儿~

大家好&#xff0c;我是雄雄&#xff0c;今天我们来看看java中的binarySearch方法&#xff01;我们都知道&#xff0c;如果我们想要在一个集合中查找某个元素所在的位置时&#xff0c;可以使用list类自带的indexOf方法&#xff0c;简单方便还快捷。不过&#xff0c;Collections…

两张趣图助你理解 HTTP 状态码

转载自 两张趣图助你理解 HTTP 状态码 HTTP状态码&#xff08;HTTP Status Code&#xff09;是用以表示网页服务器HTTP响应状态的3位数字代码。 我们可以通过查看HTTP状态码来判断服务器状态&#xff0c;常见的有404 、502等&#xff1b;但是其他不是很常见的状态码都代表什…

Java中的binarySearch方法

大家好&#xff0c;我是雄雄&#xff0c;今天我们来看看java中的binarySearch方法&#xff01; 前言&#xff1a;我们都知道&#xff0c;如果我们想要在一个集合中查找某个元素所在的位置时&#xff0c;可以使用list类自带的indexOf方法&#xff0c;简单方便还快捷。不过&…

ASP.NET Core 开源论坛项目 NETCoreBBS

ASP.NET Core 轻量化开源论坛项目&#xff0c;ASP.NET Core Light forum NETCoreBBS 采用 ASP.NET Core EF Core Sqlite Bootstrap 开发。 GitHub: https://github.com/linezero/NETCoreBBS 开发 git clone https://github.com/linezero/NETCoreBBS.git使用 Visual Studi…

使用相对长度单位em布局网页内容

顺便问一下哈&#xff1f;那个辣椒酱大家感觉怎么样&#xff0c;你们也买了也尝了&#xff0c;是不是该反馈反馈啦~~如果还有想要的&#xff0c;可以联系我呐&#xff01;原文地址&#xff1a;自从有了这款辣椒酱&#xff0c;拌饭再也不用老干妈前言&#xff1a;在页面开发中&a…

史上最全的 MySQL 高性能优化实战总结

转载自 史上最全的 MySQL 高性能优化实战总结 一、前言 MySQL 对于很多 Linux 从业者而言&#xff0c;是一个非常棘手的问题&#xff0c;多数情况都是因为对数据库出现问题的情况和处理思路不清晰。在进行 MySQL 的优化之前必须要了解的就是 MySQL 的查询过程&#xff0c;很…

.NET Core快速入门教程 3、我的第一个.NET Core App (CentOS篇)

一、前言 本篇开发环境&#xff1f;1、操作系统&#xff1a;CentOS7&#xff08;因为ken比较偏爱CentOS7&#xff09;2、SDK版本&#xff1a;.NET Core 2.0 Preview你可能需要的前置知识1、了解如何通过Hyper-V安装CentOS虚拟机2、了解CentOS7基础命令/常用命令 二、安装 .NE…

RPC(远程过程调用)

1、RPC和HTTP对比 1.1 具体实现 RPC&#xff1a;可以基于TCP协议&#xff0c;也可以基于HTTP协议。 HTTP&#xff1a;基于HTTP协议 1.2 效率 RPC&#xff1a;自定义具体实现可以减少很多无用的报文内容&#xff0c;使得报文体积更小。 HTTP&#xff1a;如果是HTTP 1.1 报文中很…