过滤器和监听器及应用

Filter及应用

  • Filter有什么用?
  • 一、Filter处理中文乱码
  • 二、监听器,统计网站在线人数
    • 1.监听器引入
    • 2.统计网站在线人数
  • 三、Filter实现权限拦截


Filter有什么用?

Filter:过滤器,可以用来过滤网站的数据。
比如
处理中文乱码
,每次写servlet,req和resp都需要重新设置编码,要是有一个机制能够在调用servlet之前就把中文乱码处理好。Filter就可以做到。
在这里插入图片描述

一、Filter处理中文乱码

  1. Filter导包不要导错:

在这里插入图片描述

  1. 过滤器Filter:
public class CharacterEncodingFilter implements Filter {//初始化,web服务器启动的时候,就已经初始化了,随时等待过滤对象出现@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");resp.setContentType("text/html");System.out.println("CharacterEncodingFilter执行前....");
//        chain:链,起一个放行的作用,不写这个,代码到这里就停住了。chain.doFilter(req,resp);System.out.println("CharacterEncodingFilter执行后.....");}//销毁,web服务器关闭时,过滤器会销毁。@Overridepublic void destroy() {//System.gc():通知垃圾回收站清理东西。System.gc();System.out.println("CharacterEncodingFilter销毁");}
}

3.对应的Servlet:

 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("你好,世界!");}

4.配置web.xml文件:

在这里插入图片描述
处理前:
在这里插入图片描述
处理后:
在这里插入图片描述

二、监听器,统计网站在线人数

1.监听器引入

浏览器是一个客户端软件,为什么点击错号就能关闭
在这里插入图片描述

2.统计网站在线人数

2.1建立监听器:


//统计网站在线人数,统计session
public class OnLineCountListener implements HttpSessionListener {
//    创建session监听:监视你的一举一动。
//    一旦创建session就会触发一次这个事件。不管是哪个session@Overridepublic void sessionCreated(HttpSessionEvent httpSessionEvent) {ServletContext sc = httpSessionEvent.getSession().getServletContext();Integer onLineCount = (Integer) sc.getAttribute("OnLineCount");if (onLineCount == null){onLineCount=new Integer(1);}else {int value = onLineCount.intValue();onLineCount=new Integer(value+1);}sc.setAttribute("OnLineCount",onLineCount);}@Overridepublic void sessionDestroyed(HttpSessionEvent httpSessionEvent) {System.out.println("已销毁1个");ServletContext sc = httpSessionEvent.getSession().getServletContext();Integer onLineCount = (Integer) sc.getAttribute("OnLineCount");if (onLineCount == null){onLineCount=new Integer(0);}else {int value = onLineCount.intValue();onLineCount=new Integer(value-1);}sc.setAttribute("OnLineCount",onLineCount);}
}

2.2 注册监听器:

   <!--    注册监听器  --><listener><listener-class>com.kuang.listener.OnLineCountListener</listener-class></listener>

2.3获取网站在线人数:

<h1>当前有 <span> <%= this.getServletConfig().getServletContext().getAttribute("OnLineCount")%> </span> 人在线!</h1>

2.4session的销毁:

session.invalidate();//手动注销
    <session-config>
<!--  自动销毁: 1分钟后,session失效,以分钟为单位。--><session-timeout>1</session-timeout></session-config>

设置销毁之后,才会触发销毁的方法,减少网站的人数。

一个浏览器是一个session:
刚开始有3个人在线,网站默认开始就有3个session,重新发布项目Redeploy就没了。
在这里插入图片描述

后面SpringMVC,SpringBoot里面的东西都是用过滤器去实现的。

三、Filter实现权限拦截

用户登录之后才能进入主页,用户注销后就不能进入主页了。
要实现这个,就要用到权限拦截。

  1. 用户登录之后,向session中存放用户的数据!
  2. 进入主页的时候要判断用户是否已经登录:要在过滤器中实现。

1.LoginServlet:

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        获取前端请求的参数String username = req.getParameter("username");if (username.equals("admin")){//登录成功req.getSession().setAttribute(Constant.USER_SESSION,req.getSession().getId());resp.sendRedirect("/sys/success.jsp");}else{resp.sendRedirect("/error.jsp");}}
  1. LogoutServlet:
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Object USER_SESSION = req.getSession().getAttribute(Constant.USER_SESSION);if (USER_SESSION!=null){req.getSession().removeAttribute(Constant.USER_SESSION);}resp.sendRedirect("/Login.jsp");}

3.过滤器:
在servlet之前加一层过滤器,实现注销后不能进入主页的功能:

    @Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
//ServletRequest  HttpServletRequest  两个不一样。前者是后者的上一级,但上一级无法得到session。HttpServletRequest request=(HttpServletRequest)req;HttpServletResponse response=(HttpServletResponse)resp;if (request.getSession().getAttribute(Constant.USER_SESSION)==null){response.sendRedirect("/error.jsp");}filterChain.doFilter(request, response);}

4.注册过滤器:

   <filter><filter-name>SysFilter</filter-name><filter-class>com.kuang.filter.SysFilter</filter-class></filter><filter-mapping><filter-name>SysFilter</filter-name><!--        过滤sys下面的所有的页面--><url-pattern>/sys/*</url-pattern></filter-mapping>

Constant 类:

public class Constant {public final static String USER_SESSION = "USER_SESSION";
}

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

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

相关文章

docker小白第六天

docker小白第六天 容器数据卷是什么 首先&#xff0c;容器卷有个坑&#xff1a;容器卷需要加入privilegedtrue&#xff0c;如下图所示&#xff0c;是为了解决permission denied的问题。其中“挂载”的意思是相当于一个硬盘插到主机上。使用该命令。是扩大容器的权限解决挂载目…

力扣面试题 16.19. 水域大小(java DFS解法)

Problem: 面试题 16.19. 水域大小 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 该问题可以归纳为一类遍历二维矩阵的题目&#xff0c;此类中的一部分题目可以利用DFS来解决&#xff0c;具体到本题目&#xff08;该题目可以的写法大体不变可参看前面几个题目&#…

几种常见开关电源电路图

用UC3842做的开关电源的典型电路见图1。过载和短路保护&#xff0c;一般是通过在开关管的源极串一个电阻&#xff08;R4&#xff09;&#xff0c;把电流信号送到3842的第3脚来实现保护。 当电源过载时&#xff0c;3842保护动作&#xff0c;使占空比减小&#xff0c;输出电压降…

旅游服务平台可视化大屏界面,UI设计PS资料

大屏通过实时的数据展示&#xff0c;可及时发现数据的变化和异常&#xff0c;以便及时采取措施。现分享蓝色简约大气旅游服务平台、蓝色渐变科技旅游服务平台可视化界面的Photoshop源文件&#xff0c;供UI设计师们快速获取PSD源文件完成工作。 若需更多 大屏组件&#xff0c;请…

图纸加密软件哪个好用丨强烈推荐这个CAD图纸加密小技巧

只有身处设计行业的老板&#xff0c;也会设身处地的感受到&#xff0c;图纸加密软件的重要性&#xff01; 因为一个图纸可能就是一单生意&#xff0c;一单生意可能就能决定公司一年的营收。所以&#xff0c;选择适合企业饿图纸加密软件势在必行。 哪个图纸加密软件比较好用呢&…

下载svn client,小乌龟

给兄弟们提供一个下载svn client的软件连接 不好用包退货 https://sourceforge.net/projects/tortoisesvn/ 点击download即可

PyQt6 QFontDialog字体对话框控件

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计50条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

Java 数据结构篇-实现堆的核心方法与堆的应用(实现 TOP-K 问题:最小 k 个数)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 堆的说明 2.0 堆的成员变量及其构造方法 3.0 实现堆的核心方法 3.1 实现堆的核心方法 - 获取堆顶元素 peek() 3.2 实现堆的核心方法 - 下潜 down(int i) 3.3 实…

嵌入式串口输入详细实例

学习目标 掌握串口初始化流程掌握串口输出单个字符掌握串口输出字符串掌握通过串口printf熟练掌握串口开发流程学习内容 需求 串口循环输出内容到PC机。 串口数据发送 添加Usart功能。 首先,选中Firmware,鼠标右键,点击Manage Project Items 接着,将gd32f4xx_usart.c添…

xcode无线真机调试详细图文步骤

步骤一、 步骤二&#xff1a; 步骤三&#xff1a; 配置完到这里&#xff0c;点击真机右键&#xff0c;菜单栏并未出现connect via ip address 选项&#xff0c;也没出现无线连接的小地球图标&#xff0c;别慌&#xff0c;接着进行下一步操作即可。 步骤四&#xff1a; 1.打开…

什么是同源策略?

同源 同源指的是URL有相同的协议、主机名和端口号。 同源策略 同源策略指的是浏览器提供的安全功能&#xff0c;非同源的RUL之间不能进行资源交互 跨域 两个非同源之间要进行资源交互就是跨域。 浏览器对跨域请求的拦截 浏览器是允许跨域请求的&#xff0c;但是请求返回…

手机端升级ChatGPT失败怎么办?解决方案

昨天一个朋友说他手机端升级失败如下图 其实手机端对IP环境要求更严格&#xff0c;升级失败很正常&#xff0c;解决办法就是使用电脑端就可以了&#xff0c;电脑端对IP环境相对来说没有手机那么严格 不管手机电脑&#xff0c;都要用最纯净的IP才行&#xff0c;如果不行&#xf…

MyBatis——MyBatis的CRUD(增删改查)

1.MyBatis的CRUD 创建工程&#xff1a; 1.1.查询 1.1.1.单个参数绑定 //单个参数传递public User findUserById(Integer id);<!--parameterType:指定输入参数的类型resultType&#xff1a;指定数据结果封装的数据类型#{id}&#xff1a;它代表占位符&#xff0c;相当于原来…

大数据讲课笔记5.1 初探MapReduce

文章目录 零、学习目标一、导入新课二、新课讲解&#xff08;一&#xff09;MapReduce核心思想&#xff08;二&#xff09;MapReduce编程模型&#xff08;三&#xff09;MapReduce编程实例——词频统计思路1、Map阶段&#xff08;映射阶段&#xff09;2、Reduce阶段&#xff08…

【Java异常】idea 报错:无效的目标发行版:17 的解决办法

【Java异常】idea 报错&#xff1a;无效的目标发行版&#xff1a;17 的解决办法 一&#xff0c;问题来源 springcloud的第一个demo项目就给我干趴了 二、原因分析 java: 无效的目标发行版: 17 原因就是 JDK 版本不对。从 IDEA 编辑器中可以找到问题的原因所在&#xff0c;…

ImportError: cannot import name ‘calcsize‘ from ‘struct‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

英文表示数字_分支结构 C语言xdoj146

题目描述&#xff1a;输入一个0~9的一位整数&#xff0c;输出其对应的英文单词。要求用switch结构完成。 示例&#xff1a; 输入&#xff1a;0 输出&#xff1a;zero 输入&#xff1a;8 输出&#xff1a;eight #include <stdio.h>//英文表示数字_分支结构 int main() {in…

爬虫中scrapy模块的概念作用和工作流程

scrapy的概念和流程 学习目标&#xff1a; 了解 scrapy的概念了解 scrapy框架的作用掌握 scrapy框架的运行流程掌握 scrapy中每个模块的作用 1. scrapy的概念 Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。 Scrapy 使…

状态管理之复杂对象

前面我们学习的State、Prop、Link、Provide、Consume这些装饰器都只能更新对象的直接赋值、对象属性赋值&#xff1b;如果对象的属性又是一个对象&#xff0c;也就是嵌套对象&#xff0c;那么对嵌套对象的属性的更新是不会被观察到的&#xff0c;所以复杂状态管理用于解决该问题…