当前位置: 首页 > news >正文

(过滤器)Filter和(监听器)listener

过滤器 Filter

Filter是什么?

  • JavaWeb的一个重要组件,可以对发送到servlet的请求进行拦截过滤,也可以对响应进行拦截

  • Filter是实现了Filter接口的Java类

  • Filter需要在web.xml中进行注册,也可以通过注解来注册。

如何创建一个Filter—只需要创建一个类,实现Filter接口即可。

字符集的过滤器

package afternoon.filter;
​
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
    字符编码集的过滤器
    过滤拦截什么请求?
 */
@WebServlet
public class EncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
​
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
​
        //放行
        filterChain.doFilter(servletRequest, servletResponse);
        
        /*
            给response添加响应头,text/html,后台向前台输出字符串的时候
            当后台向前台输出的是json串的格式时,不需要设置这个。
         */
        response.addHeader("content-type","text/html;charset=utf-8");
    }
}

监听器 listener

专门用于对其他对象身上发生的事件或状态改变进行监听和响应的处理

主要监听作用域的对象的改变

监听器监听的是域对象,不是监听对象的某个地址

JavaEE(servlet)三大件

servlet、filter、listener

监听器的分类

  • 监听域对象自身的创建和销毁

package afternoon.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/*
    监听域对象自身的创建和销毁
 */
public class HelloListener implements HttpSessionListener, ServletRequestListener, ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContextListener.super.contextInitialized(sce);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ServletContextListener.super.contextDestroyed(sce);
    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        ServletRequestListener.super.requestDestroyed(sre);
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        ServletRequestListener.super.requestInitialized(sre);
    }

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        HttpSessionListener.super.sessionCreated(se);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        HttpSessionListener.super.sessionDestroyed(se);
    }
}
  • 监听域对象中属性的增加和删除

package afternoon.listener;
​
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
/*
    监听域对象中属性的增加和删除
 */
​
@WebListener
public class HelloAttributeListener implements ServletContextAttributeListener, ServletRequestAttributeListener, HttpSessionAttributeListener {
​
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        ServletContextAttributeListener.super.attributeAdded(scae);
    }
​
    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        ServletContextAttributeListener.super.attributeRemoved(scae);
    }
​
    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        ServletContextAttributeListener.super.attributeReplaced(scae);
    }
​
    @Override
    public void attributeAdded(ServletRequestAttributeEvent srae) {
        ServletRequestAttributeListener.super.attributeAdded(srae);
    }
​
    @Override
    public void attributeRemoved(ServletRequestAttributeEvent srae) {
        ServletRequestAttributeListener.super.attributeRemoved(srae);
    }
​
    @Override
    public void attributeReplaced(ServletRequestAttributeEvent srae) {
        ServletRequestAttributeListener.super.attributeReplaced(srae);
    }
​
    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {
        HttpSessionAttributeListener.super.attributeAdded(se);
    }
​
    @Override
    public void attributeRemoved(HttpSessionBindingEvent se) {
        HttpSessionAttributeListener.super.attributeRemoved(se);
    }
​
    @Override
    public void attributeReplaced(HttpSessionBindingEvent se) {
        HttpSessionAttributeListener.super.attributeReplaced(se);
    }
}
​
  • 监听绑定到session中的某个对象的状态的事件监听

package afternoon.listener;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;

/*
    监听绑定到session中的某个对象的状态的事件监听
 */
public class HelloSessionListener implements HttpSessionActivationListener {


    //在钝化之前被调用
    @Override
    public void sessionWillPassivate(HttpSessionEvent se) {
        HttpSessionActivationListener.super.sessionWillPassivate(se);
    }

    //在活化之后被调用
    @Override
    public void sessionDidActivate(HttpSessionEvent se) {
        HttpSessionActivationListener.super.sessionDidActivate(se);
    }

    /*
        活化:从磁盘中读取session对象
        钝化:向磁盘中写入session对象
     */
}

活化:从磁盘中读取session对象

钝化:向磁盘中写入session对象

@WebListener注解加上以后才可以监听域对象

配置监听器

  • 注解

@WebListener
  • XML配置

<listener>
        <listener-class>afternoon.listener.HelloListener</listener-class>
    </listener>

相关文章:

  • Java 并发编程解析 | 如何正确理解Java领域中的锁机制,我们一般需要掌握哪些理论知识?
  • Vue项目流程7,交易页面,提交订单,支付页面,利用element UI 以及 QRCode 完成微信支付,弹出框按钮的相关工作,个人中心以及子路由我的订单
  • 在Java中使用SFTP传输文件
  • OC5860降压芯片,MPS2459脚位一样,节省肖特基规格书
  • 哈工大李治军老师操作系统笔记【4】:系统调用的实现(Learning OS Concepts By Coding Them !)
  • 【光学】基于matlab色散曲线拟合【含Matlab源码 2053期】
  • (多级缓存)多级缓存
  • 复习三:线性表
  • C/C++语言100题练习计划 87——火柴棒等式(枚举实现)
  • 数仓架构演进
  • 约瑟夫问题对应算法的实现(思路分析) [Java][数据结构]
  • 深圳市第十二届职工技术创新运动会暨2022年深圳技能大赛—集成电路应用开发职业技能竞赛
  • 携职教育:对于想进入财务工作的人来说,第一个证考CPA还是CMA?
  • PostgreSQL 创建数据库、创建用户、赋予权限、创建表、主键总结
  • SynchroTrap:基于相似度的异常检测算法
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • ES学习笔记(12)--Symbol
  • go append函数以及写入
  • JSONP原理
  • Laravel 中的一个后期静态绑定
  • nfs客户端进程变D,延伸linux的lock
  • NSTimer学习笔记
  • Python进阶细节
  • Vue2.x学习三:事件处理生命周期钩子
  • 编写高质量JavaScript代码之并发
  • 初识 beanstalkd
  • 初探 Vue 生命周期和钩子函数
  • 我感觉这是史上最牛的防sql注入方法类
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 转载:[译] 内容加速黑科技趣谈
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​secrets --- 生成管理密码的安全随机数​
  • ###C语言程序设计-----C语言学习(6)#
  • #QT项目实战(天气预报)
  • (33)STM32——485实验笔记
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (三)终结任务
  • (转)可以带来幸福的一本书
  • (转)用.Net的File控件上传文件的解决方案
  • .gitignore
  • .NET分布式缓存Memcached从入门到实战
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • ?
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用
  • [C++]二叉搜索树
  • [Docker]十二.Docker consul集群搭建、微服务部署,Consul集群+Swarm集群部署微服务实战
  • [HNCTF 2022 WEEK2]easy_include 文件包含遇上nginx
  • [IDF]被改错的密码
  • [IM] [Webhook] Webhook实现IM平台机器人