Web组件:Servlet Listener Filter

news2024/11/23 18:51:56

1 前言

1.1 内容概要

  1. 掌握ServletContextListener的使用,并且理解其执行时机
  2. 掌握Filter的使用,并且理解其执行时机
  3. 能够使用Filter解决一些实际的问题

1.2 前置知识准备

  • Servlet的执行

  • ServletContext的功能和使用

2 Web组件

JavaEE的三大Web组件

  1. Servlet → 处理请求对应的业务
  2. Listener → 监听器
  3. Filter → 过滤器

2.1 Listener监听器

顾名思义就是监听东西的,其实和命名有关系,我们提供的是什么监听器就是监听什么的。

UserListener 就是监听User

监听器在监听到主体做了XX事情,就会触发对应的事件。

2.2 ServletContextListener

监听的主体就是ServletContext,当发现ServletContext做了事情,监听器就会执行该事件特定的方法

  • ServletContext如果初始化,则会执行监听器的初始化方法
  • ServletContext如果销毁,则会执行监听器的销毁方法
  1. 如果我们想要在应用程序启动的过程中,实现一些自定义的代码,需要方法ServletContextListener的监听ServletContext初始化的方法对应的执行方法 → 监听器的初始化方法,会在应用程序启动的时候执行,主要做一些资源的初始化
  2. 如果我们想要在应用程序关闭的过程中,实现一些自定义的代码,放在监听器的销毁方法 → 监听器的销毁方法,会在应用程序关闭(卸载的时候执行) ,主要做资源的释放

2.3 执行过程

当应用程序启动的过程中,逐步加载Web组件

  • 首先会加载ServletContext和Listener组件
    • ServletContext伴随着应用程序初始化,它开始初始化,然后ServletContextListener监听到ServletContext初始化,会执行Listener的Initialized方法
  • 然后初始化loadOnStartup为正数的Servlet

在这里插入图片描述

改造之前的业务代码,之前整合MyBatis时,SqlSessionFactory的初始化是通过Servlet的生命周期init方法,当前可以通过ServletContextListener,在应用程序启动的时候,执行contextInitialized方法,在该方法中进行SqlSessionFactory初始化过程,并将其放到ServletContext中

@WebListener
public class CustomServletContextListener implements ServletContextListener {
    // 当ServletContext初始化的时候执行
    // 应用程序启动的时候向ServletContext中塞入一些数据
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        ServletContext servletContext = servletContextEvent.getServletContext();
        SqlSessionFactory sqlSessionFactory = null;
        try {
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
            System.out.println("ServletContext初始化");
            System.out.println("sqlSessionFactory = " + sqlSessionFactory);
        } catch (IOException e) {
            e.printStackTrace();
        }
        servletContext.setAttribute("SqlSessionFactory",sqlSessionFactory);
    }

    // 当ServletContext销毁的时候执行
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext销毁");

    }
}
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {

    SqlSessionFactory sqlSessionFactory;

    @Override
    public void init() throws ServletException {
        ServletContext servletContext = getServletContext();
        sqlSessionFactory = (SqlSessionFactory) servletContext.getAttribute("SqlSessionFactory");
        System.out.println("Servlet初始化");
        System.out.println("sqlSessionFactory = " + sqlSessionFactory);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

在这里插入图片描述

提供Listener,其实主要就是去初始化这个ServletContext

SpringMVC就是基于这样的特点去实现的

3 Filter

Filter是一个执行过滤任务的一个对象。它既可以作用于Request对象,也可以作用于Response对象,或者两者均作用。

也就是Servlet中获取请求之前,Servlet响应之后

在这里插入图片描述

3.1 Filter和Servlet的执行

URL-Pattern和Servlet之间存在着映射关系,URL-Pattern和Filter之间也存在着映射关系。

  • 1个URL-Pattern只能对应一个Servlet,但是可以对应多个Filter
  • Servlet和URL-Pattern之间是一对多的关系,但是URL-Pattern和Servlet之间是一对一

其实就意味着一件事,当我们发起一个请求的时候,其实就是一个URL-Pattern对应的请求

  • 对应1个Servlet
  • 对应多个Filter

在这里插入图片描述

如果只有一个过滤器那么执行流程如下

在这里插入图片描述

多个过滤器,就是就组成了一个过滤器的链,依次执行过滤器

在这里插入图片描述

如果增加上对应的方法

在这里插入图片描述

有一个问题,是否每一次都会继续执行到下一个拦截器或Servlet?不一定,去界定是否为放行状态

doFilter这个方法中,提供了一个形参,形参叫filterChain,filterChain中提供了一个doFilter方法,如果执行这个方法就是放行,如果不执行,则中断流程

在这里插入图片描述

3.2 使用

/**
 * localhost:8080/demo5/hello
 * localhost:8080/demo5/bye
 * URL-Pattern对于上面两个请求都能起作用,那么我们的URL-Pattern可以设置为 /*
 */
@WebFilter("/*")
public class URLPrintFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String url = request.getRequestURL().toString();
        System.out.println("url = " + url);
        System.out.println("Filter的前半部分");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("Filter的后半部分");
    }

    @Override
    public void destroy() {

    }
}

就算没有Servlet,仍然是可以执行到Filter的

在这里插入图片描述
在这里插入图片描述

Filter能否继续执行,取决于FilterChain的doFilter方法是否执行

3.3 案例

3.3.1 给请求和响应设置字符集

Post请求中文乱码

request.setCharacterEncoding(“utf-8”)

响应的时候,响应的字符中文乱码

response.setContentType(“text/html;charset=utf-8”)

@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        request.setCharacterEncoding("utf-8");
        //response.setContentType("text/html;charset=utf-8");
        response.setContentType("application/json;charset=utf-8");
        filterChain.doFilter(request, response);
    }

    @Override
    public void destroy() {

    }
}

3.3.2 登录案例

Http://localhost:8080/demo6/user/login

Http://localhost:8080/demo6/user/info

在Session中是否有存储用户的信息

  1. login登录实现的什么事情?
    1. 验证用户传入的用户名和密码,和数据库中存储的信息是否一致
    2. 验证如果成功,将用户信息存到Session里面
  2. info查看用户信息实现的是什么事情
    1. 从Session中取出信息,分析是否取出了信息
    2. 如果取出了信息,说明登录成功了,根据取出的信息查询用户的具体信息
    3. 如果没有取出信息,提示未登录的json数据
  3. order/list 查询当前用户的订单信息
    1. 从Session中取出信息,分析是否取出了信息
    2. 如果取出了信息,说明登录成功了,根据取出的信息查询用户的订单信息
    3. 如果没有取出信息,提示未登录的json数据
  4. 发现了2a和3a做的是相同的事情,2c和3c做的也实现相同的事情,相同的事情我们可以提取到Filter中
  5. 如果我提取到了Filter中 2中只有2b ,3中只有3b

4 小结

4.1 Web组件

  • 核心是Servlet,处理核心业务
  • Listener,用来做资源的初始化
  • Filter,在Servlet处理前后增加通用的处理

在这里插入图片描述

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

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

相关文章

Aigtek功率放大器在超声检测陶瓷复合材料内部缺陷中的应用

2023年5月30日,神舟十六号载人飞船于9时28分左右在酒泉基地正式发射。本次神舟十六号最引人注目的一点就是它的元件国产率相较之前是大大提高了。选择提高自主研发能力,一方面是防范他国在技术、贸易上的“卡脖子”隐患,一方面也是我国制造实…

【智慧物流】新中地智慧城市实训:优秀学生项目作品1

实训结束后,同学们在最后的答辩中纷纷展现了自己的优秀成果,并以小组的形势进行汇报。今天截取部分学生优秀作品给大家进行展示,帮助大家快速了解智慧系列项目的效果。 智慧城市开发项目主题:智慧物流 (为保护学生隐…

亲测好用,ChatGPT 3.5/4.0新手使用手册,最好论文指令手册~ 【2024年9月 更新】

本以为遥遥领先的GPT早就普及了,但小伙伴寻找使用的热度一直高居不下,其实现在很简单了! 国产大模型快200家了,还有很多成熟的国内AI产品,跟官网一样使用,还更加好用~ ① 3.5 大多数场景是够用的&#xff…

热门运动耳机品牌有哪些?精选五款骨传导耳机运动好物分享

随着人们对于听力和健康问题的重视,不管是日常、运动还是游泳骨传导耳机逐渐成为了更健康、便捷的听音方式。因为行业的爆火,骨传导耳机市场的竞争也是非常激烈,有很多没有专业技术沉淀的品牌也来做骨传导耳机想吃这波红利,很容易…

SysML图例-混合动力SUV

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>>

swagger-bootstrap-ui页面空白,也没报错

回想起来,代码层面没有进行什么大的调整,增加了配置文件,application.yml中的 spring:profiles:active: sms # dev --> smsname: sms-server swagger配置未调整导致空白 修改profile 问题解决

.htaccess防火墙,Nginx防火墙,Apache防火墙,WEB防火墙,网站防火墙

.htaccess防火墙,Nginx防火墙,Apache防火墙,WEB防火墙,网站防火墙 对此域的请求通过 Apache 处理。 在 nginxdev.com 测试 Nginx 服务器上的防火墙 防火墙代码: # 资源宝分享:www.httple.net # 8G FIREWA…

当你忘记很久前的 DJANGO + UWSGI 项目是怎么启动的

在后端项目代码推到云服务器后,通常需要手动重启相关服务才会更新生效。 本人生产环境中用的是UWSGI服务器,更新步骤如下: 文章目录 UWSGI服务启动方式SYSTEMCTL 命令查看查看当前运行的 UWSGI 进程其他:查看 UWSGI 日志文件 重启…

基于Vue框架的娱爆新闻网站的设计与实现---附源码80930

目 录 摘要 1 绪论 1.1研究背景与意义 1.2国内外研究现状 1.3研究内容 1.4论文结构与章节安排 2 娱爆新闻网站系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.2.2数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功…

Redis面试必问:Redis为什么快?Redis五大基本数据类型

请记住胡广一句话,所有的中间件所有的框架都是建立在基础之上,数据结构,计算机网络,计算机原理大伙一定得看透!!~ 1. Redis快的秘密 相信大部分Redis初学者都会忽略掉一个重要的知识点,Redis…

计算机网络 ---如何寻找目标计算机

序言 在没有产生网络之前,单个主机就像汪洋大海之间的一个孤岛,和其他主机之间没有任何联系。但随着需求的产生,免不了两台主机之间需要产生交流(传送数据等)。离得近的两台主机之间搭一根网线就能够解决,但…

147.最小栈

题目 链接:leetcode链接 思路 这道题目做起来还是比较简单的,使用两个栈就可以实现题目要求。 其中一个栈s实现栈的基本功能,另一个栈mins实现检索最小元素的功能。 来看一下怎么样实现检索最小元素的功能呢? 我们可以这么…

VTK-vtkBandedPolyDataContourFilter学习

官网有一个例子,看完之后仍然不太明白。经过一点点的探索,记录一下收获。 1.建立一个六边形的点集 Create(vtkPoints, points);points->InsertNextPoint(-5, 0, 0);points->InsertNextPoint(-2.5, -4.33, 0);points->InsertNextPoint(2.5, -4.…

网络安全-dom破坏结合jq漏洞以及框架漏洞造成的xss-World War 3

一、环境 XSS Game - Learning XSS Made Simple! | Created by PwnFunction 二、开始介绍 如果notify为真的话那么html是 <div class"alert alert-warning" role"alert"><b>Meme</b> created from ${DOMPurify.sanitize(text)}</d…

DevOps实现CI/CD实战(七)- Jenkins集成k8s实现自动化CI

自动化CI操作 1. 安装gitlab plugin 工具 ##### 2. 配置流水线任务的构建触发器&#xff0c;复制URL&#xff1a;http://192.168.201.111:8080/project/pipeline 3. Gitlab配置Webhooks&#xff0c;将上面的url&#xff1a;http://192.168.201.111:8080/project/pipeline粘…

基于微信小程序+Java+SpringBoot+Vue+MySQL的网上花店/鲜花销售小程序

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的网上花店/鲜花销售…

AI绘画stable diffussion :Lora大模型微调的利器

前言 LoRA模型是小型的Stable Diffusion模型&#xff0c;它们对checkpoint模型进行微小的调整。它们的体积通常是检查点模型的10到100分之一。因为体积小&#xff0c;效果好&#xff0c;所以lora模型的使用程度比较高。 这是一篇面向从未使用过LoRA模型的初学者的教程。你将了…

使用tesseract.js插件实现前端js识别提取图片的文字

<!DOCTYPE html> <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图像OCR Tesseract.js 测试…

给豆包MarsCode 编程插件点赞

本文正在参加豆包MarsCode测评官征文活动 首先MarsCode 拉新福利还是蛮高的有E卡、周边T恤、肯德基代金券显卡等hahaha…… 略微炫耀一下100京东E卡&#xff0c;真香&#xff01; 活动入口&#xff1a;https://www.marscode.cn/events/s/ihx7hkNY/ 顺手帮忙助个力谢谢~ 2…

人工智能 | 搭建企业内部的大语言模型系统

大纲 开源大语言模型大语言模型管理私有大语言模型服务部署方案 开源大语言模型 担心安全与隐私&#xff1f;可私有部署的开源大模型 商业大模型&#xff0c;不支持私有部署 ChatGPTClaudeGoogle Gemini百度问心一言 开源大模型&#xff0c;支持私有部署 MistralMeta Llama…