过滤器和监听器及应用

news2024/9/21 16:21:14

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";
}

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

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

相关文章

k8syaml提供的几个有意思的功能,Kubernetes在线工具网站

k8syaml.cn 提供的几个有意思的功能。 一、yaml资源快速生成 之前编写operator的helm的时候就需要自己写deployment、service、configmap这些资源&#xff0c;那么多字段也记不清&#xff0c;都是先找个模版&#xff0c;然后copy改改&#xff0c;再看官方文档&#xff0c;添加…

LeetCode(66)二叉树的最大深度【二叉树】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 二叉树的最大深度 1.题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7]…

[已解决】uniapp内置插件,editor富文本报错(附quill.min.js、image-resize.min.js文件)

在使用uni-app运行内置插件editor时&#xff0c;无法输入内容&#xff0c;控制台报错 原因&#xff1a;查看官网得知&#xff0c;需动态引入quill.min.js、image-resize.min.js文件 解决方法&#xff1a; 1.下载quill.min.js、image-resize.min.js到项目static/eidtor文件中 链…

在Windows上通过cmake-gui及VS2019来 编译OpenCV-4.5.3源码

文章目录 下载OpenCV-4.5.3源码下载opencv_contrib-4.5.3源码打开cmake-gui选择生成器 通过 Visual Studio 2019 打开构建好的.sln工程文件执行编译操作执行安装操作 下载OpenCV-4.5.3源码 可通过github上下载&#xff0c;网上很多&#xff0c;找到tag标签&#xff0c;选择 Op…

TCP/IP详解——HTTP 协议

文章目录 1. HTTP 协议1.1 URL 的格式1.2 请求报文分析1.2.1 请求行1.2.2 请求头 1.3 响应报文分析1.3.1 状态行1.3.2 响应报头 1.4 HTTP 工作原理1.5 Request 消息1.6 Request 包解码1.7 Response 消息1.8 HTTP 协议抓包分析1.8.1 CSNAS 抓包查看1.8.2 Wireshark 抓包查看1.8.…

关于枚举的简单理解

1. 枚举的简单认识 1.1 枚举的引入 枚举是在JDK1.5以后引入的。主要用途是&#xff1a;将一组常量组织起来&#xff0c;在这之前表示一组常量通常使用定义常量的方式如下面的代码所示&#xff1a; public static final int RED 1; public static final int GREEN 2; public…

git代码管理学习文档

1.版本控制 每一版本都会发生变化 更新版本&#xff0c;回退版本 版本控制实际就是控制文件的变化 服务器端和每个人的电脑上都会记录版本的变化&#xff0c;也就是说整个团队都记录了版本的变化。 不需要连网&#xff0c;他是分布式的&#xff0c;在自己电脑上也可以操作。 …

Easy Excel生成复杂下Excel模板(下拉框)给用户下载

引言 文件的下载是一个非常常见的功能&#xff0c;也有一些非常好的框架可以使用&#xff0c;这里我们就介绍一种比较常见的场景&#xff0c;下载Excel模版&#xff0c;导入功能通常会配有一个模版下载的功能&#xff0c;根据下载的模版&#xff0c;填充数据然后再上传。 需求…

【MATLAB第82期】基于MATLAB的季节性差分自回归滑动平均模型SARIMA时间序列预测模型含预测未来

【MATLAB第82期】基于MATLAB的季节性差分自回归滑动平均模型SARIMA时间序列预测模型含预测未来 一、模型介绍 1、模型简介 季节性差分自回归移动平均模型&#xff08;Seasonal Autoregressive Integrated Moving Average Model, SARIMA&#xff09;&#xff0c;又称为周期性…

指针进阶篇

指针的基本概念&#xff1a; 指针是一个变量&#xff0c;对应内存中唯一的一个地址指针在32位平台下的大小是4字节&#xff0c;在64位平台下是8字节指针是有类型的&#xff0c;指针类型决定该指针的步长&#xff0c;即走一步是多长指针运算&#xff1a;指针-指针表示的是两个指…

SQL注入学习(配合SQLi-lab靶场)

前提条件&#xff1a; 在进行sql注入时&#xff0c;首先要确定网页有注入点&#xff0c;一般在URL地址栏中&#xff0c;或者含有输入框的地方会有 SQL注入步骤&#xff1a; 1、判断注入类型 首先判断是什么类型的注入&#xff0c;用id1 and 11 和id1 and 12 判断是数字类型注…

Redis设计与实现之整数集合

目录 一、内存映射数据结构 二、整数集合 1、整数集合的应用 2、数据结构和主要操作 3、intset运行实例 创建新intset 添加新元素到 intset 添加新元素到 intset&#xff08;不需要升级&#xff09; 添加新元素到 intset (需要升级) 4、升级 升级实例 5、关于升级 …

25.Java程序设计-基于SSM框架的微信小程序校园求职系统的设计与实现

1. 引言 1.1 背景 介绍校园求职系统的背景&#xff0c;说明为什么设计这个系统以及系统的重要性。 1.2 研究目的 阐述设计基于SSM框架的微信小程序校园求职系统的目标和意义。 2. 需求分析 2.1 行业背景 分析校园求职行业的特点和需求&#xff0c;以及目前市场上同类系统…

Spring Boot SOAP Web 服务端和客户端

一. 服务端 1. 技术栈 JDK 1.8&#xff0c;Eclipse&#xff0c;Maven – 开发环境SpringBoot – 基础应用程序框架wsdl4j – 为我们的服务发布 WSDLSOAP-UI – 用于测试我们的服务JAXB maven 插件 – 用于代码生成 2.创建 Spring Boot 项目 添加 Wsdl4j 依赖关系 编辑pom…

化学方程式小程序

brief introduction 相信大家上中学时都会被化学方程式折腾得死去活来&#xff0c;尤其是配平&#xff0c;怎么也算不对数字。于是我写出了这款近200行的自动配平程序&#xff0c;这是不是你们黑暗化学中的一丝光亮呢&#xff1f; usage 正常化学式输入&#xff0c;每一种物…

智慧农业大数据可视化UI,数据展示平台(免费可视化大屏模版PS资料)

大屏幕展示方式可以实现信息的直观呈现与交互操作&#xff0c;使农业生产者能够一目了然地掌握有关农情、天气、土壤等数据信息&#xff0c;从而科学决策。智慧农业大数据可视化大屏是提升农业生产效益的一种重要工具。 现分享亩产效益指标、农业大数据可视化、农业数据展示平…

基于EasyExcel的数据导入导出

前言&#xff1a; 代码复制粘贴即可用&#xff0c;主要包含的功能有Excel模板下载、基于Excel数据导入、Excel数据导出。 根据实际情况修改一些细节即可&#xff0c;最后有结果展示&#xff0c;可以先看下结果&#xff0c;是否是您想要的。 台上一分钟&#xff0c;台下60秒&a…

QT Widget - 随便画个圆

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

前端传递参数,后端如何接收

目录 简单参数 传递方式 获取方式一 获取方式二 相关注解 实体参数 数组集合参数 传递方式 相关注解 获取方式一 获取方式二 日期参数 传递方式 相关注解 获取方式 json参数 传递方式 相关注解 获取方式 路径参数 传递方式 相关注解 获取方式 传递多个…

【Java系列】详解多线程(三)—— 线程安全(上篇)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习Java的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一…