过滤器和监听器及应用

Filter及应用

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


Filter有什么用?

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

一、Filter处理中文乱码

  1. Filter导包不要导错:

在这里插入图片描述

  1. 过滤器Filter:
public class CharacterEncodingFilter implements Filter {
    //初始化,web服务器启动的时候,就已经初始化了,随时等待过滤对象出现
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

  
    @Override
    public 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服务器关闭时,过滤器会销毁。
    @Override
    public 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
    @Override
    public 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);
    }

    @Override
    public 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之前加一层过滤器,实现注销后不能进入主页的功能:

    @Override
    public 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";
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Verilog] Verilog 基本格式和语法

主页&#xff1a; 元存储博客 全文 3000 字 文章目录 1. 声明格式1.1 模块声明1.2 输入输出声明1.3 内部信号声明1.4 内部逻辑声明1.5 连接声明1.6 数据类型声明1.7 运算符和表达式1.8 控制结构 2. 书写格式2.1 大小写2.2 换行2.3 语句结束符2.4 注释2.5 标识符2.6 关键字 1. 声…

VM虚拟机打不开原来保存的虚拟机文件夹ubuntu

VMWare虚拟机打不开原来保存的虚拟机文件夹ubuntu 换了电脑把之前的虚拟机克隆的文件夹直接拿来用 报这个错&#xff1a; 指定的文件不是虚拟磁盘 打不开磁盘“D:\ubuntu_iso\ubuntu_location\Ubuntu 64 位-s002.vmdk”或它所依赖的某个快照磁盘。 模块“Disk”启动失败。 未…

图像生成算法评估指标

IS P(y|x)分布越尖越好&#xff0c;说明他质量好&#xff0c;能够被模型很好的识别&#xff1b;P&#xff08;y&#xff09;表示生成n张图片的概率的均值&#xff0c;越平说明每个类别生成越平均&#xff0c;说明多样性好&#xff1b;IS越大说明这两个分布差别越大&#xff0c;…

php查询数据库,并通过表格展示

第一步&#xff1a;创建数据库 创建一个数据库php-crud 第二步&#xff1a;创建数据库表 在数据库php-crud下创建一个歌曲表song /*Navicat Premium Data TransferSource Server : MariaDBSource Server Type : MariaDBSource Server Version : 100605 (10.6.5-M…

HarmonyOS给应用添加消息通知

给您的应用添加通知 通知介绍 通知旨在让用户以合适的方式及时获得有用的新消息&#xff0c;帮助用户高效地处理任务。应用可以通过通知接口发送通知消息&#xff0c;用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应用&#xff0c;通知主要有以下使用场景…

nodejs微信小程序+python+PHP技术下的音乐推送系统-计算机毕业设计推荐

音乐推送系统采取面对对象的开发模式进行软件的开发和硬体的架设&#xff0c;能很好的满足实际使用的需求&#xff0c;完善了对应的软体架设以及程序编码的工作&#xff0c;采取MySQL作为后台数据的主要存储单元&#xff0c;  本文设计了一款音乐推送系统&#xff0c;系统为人…

PrimDiffusion:3D 人类生成的体积基元扩散模型NeurIPS 2023

NeurIPS2023 &#xff0c;这是一种用于 3D 人体生成的体积基元扩散模型&#xff0c;可通过离体拓扑实现明确的姿势、视图和形状控制。 PrimDiffusion 对一组紧凑地代表 3D 人体的基元执行扩散和去噪过程。这种生成建模可以实现明确的姿势、视图和形状控制&#xff0c;并能够在…

CSS margin-trim

margin-trim 主角登场主角的局限性兼容性 margin-trim &#x1f9ea;这是一个实验性的属性, 目前仅有 Safari 支持 看这个属性的名字就知道, 外边距修剪. 平常都会遇到一些排版上的问题, 比如垂直排列的元素之间增加下外边距 <div><li>123</li><li>…

方差分析实例

目录 方差分析步骤 相关概念 基本思想 随机误差 系统误差 组内方差 组间方差 方差的比较 方差分析的前提 1.每个总体都应服从正态分布 2.各个总体的方差必须相同 3.观察值是独立的 原假设成立 备择假设成立 单因素方差分析 提出假设 检验的统计量 水平的均值…

SpringBoot2

将SpringBoot项目打包 将打好的jar包发给前端&#xff08;前端只需要安装jdk&#xff09; 在jar包所在目录执行dos命令&#xff1a;java -jar xxx.jar&#xff0c;就可以启动项目 也可以在命令后面修改配置&#xff0c;例如&#xff1a;java -jar xxx.jar --server.port8081&…

【MySQL】启动 和 连接 MySQL

启动停止 mysql安装成功后在cmd输入 net start mysql80 //启动 net stop mysql80 //停止 mysql连接 方式1. 通过客户端去连接 方式2.使用cmd去连接 描述&#xff1a;-u是指定 用户 -p是指定密码 mysql -u root -p password

哈希扩展:位图与布隆过滤器

目录 1. 位图1.1 位图引入1.2 位图概念1.3 位图的模拟实现1.4 位图相关问题1.5 位图的应用 2. 布隆过滤器2.1 布隆过滤器概念2.2 模拟实现2.3 布隆过滤器相关问题2.3.1 哈希切分 1. 位图 1.1 位图引入 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&…

MySQL,分组order by

一、创建分组 ## 创建分组 -- 返回每个发布会的参会人数 SELECT event_id,COUNT(*) as canjia_num FROM sign_guest GROUP BY event_id; 1、group by子句可以包含任意个列&#xff0c;但是但指定的所有列都是一起计算的。 group by 后2个字段一起计算的 2、group by后面可以跟…

QT Widget - 随便画个圆

简介 实现在界面中画一个圆, 其实目的是想画一个LED效果的圆。代码 #include <QApplication> #include <QWidget> #include <QPainter> #include <QColor> #include <QPen>class LEDWidget : public QWidget { public:LEDWidget(QWidget *pare…

正态总体的假设检验

一、三种情况 1.均值μ的假设检验 (1)σ已知 (2)σ未知 2.方差σ的假设检验 二、例题

Docker部署wordpress和Jenkins

准备机器&#xff1a; 192.168.58.151 &#xff08;关闭防火墙和selinux&#xff09; 安装好docker服务 &#xff08;详细参照&#xff1a;http://t.csdnimg.cn/usG0s 中的国内源安装docker&#xff09; 部署wordpress: 创建目录&#xff1a; [rootdocker ~]# mkdi…

【Java JVM】运行时数据区

JVM 在执行 Java 程序的过程中会把它管理的内存分为若干个不同的数据区域, 这些区域有着各自的用途。 根据《Java虚拟机规范》中规定, JVM 所管理的内存大致包括以下几个运行时数据区域, 如图所示: 这个运行时数据区被分为了 5 大块 方法区 (Method Area)堆 (Heap)虚拟机栈 (V…

Facebook广告系统结构

Facebook广告系统是一个复杂的大型系统&#xff0c;由多个组件和子系统相互配合工作&#xff0c;实现了广告的投放、拍卖、个性化推荐和效果评估等功能。下面小编讲讲Facebook广告系统的结构。 1、广告管理界面 广告管理界面是广告主与Facebook进行交互的入口&#xff0c;广告…

FlinkSQL中的窗口

多维分析 需求&#xff1a;有一张test表&#xff0c;表的字段为&#xff1a;A, B, C, amount, 其中A, B, C为维度字段&#xff0c;求以三个维度任意组合&#xff0c;统计sum(amount) Union方案&#xff1a; A, B, C的任意组合共有8种&#xff0c;分别为&#xff08;A, B,C,AB…

软件工程期末复习+数据仓库ETL

一、软件工程 请用基本路径测试方法为下列程序设计测试用例&#xff0c;并写明中间过程&#xff1a; 第1步&#xff1a;画出流程图 1.菱形用于条件判断。用在有分支的地方。 2.矩形表示一个基本操作。 3.圆形是连接点 第2步&#xff1a;计算程序环路复杂性 流图G的环路复杂…