ServletContext和过滤器

news2024/9/26 5:21:53

在这里插入图片描述

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:JAVA开发者成长之路
✨特色专栏:国学周更-心性养成之路
🥭本文内容:Servlet生命周期和线程安全
更多内容点击👇
      Servlet转发与重定向

本文目录

  • ServletContext(重要)
    • 1.1 ServletContext概述
    • 1.2 获取ServletContext对象
    • 1.3 ServletContext作用
      • 1.3.1 获取项目真实路径
      • 1.3.2 获取项目上下文路径
      • 1.3.3 全局容器
    • 1.4 ServletContext特点
    • 1.5 ServletContext应用场景
    • 1.6 作用域总结
  • 过滤器(重要)
    • 1.1 现有问题
    • 1.2 概念
    • 1.3 过滤器作用
    • 1.4 编写过滤器
      • 1.4.1 实现过程
    • 1.5 过滤器配置
      • 1.5.1 注解配置
      • 1.5.2 过滤器路径
    • 1.6 过滤器链和优先级
      • 1.6.1 过滤器链
      • 1.6.2 过滤器优先级
    • 1.7 过滤器典型应用
      • 1.7.1 过滤器解决编码
      • 1.7.2 权限验证

在这里插入图片描述

ServletContext(重要)

1.1 ServletContext概述

(1)全局对象,也拥有作用域,对应一个Tomcat中的Web应用

(2)当Web服务器其中时,会为每一个Web应用程序创建一块共享的存储区域(ServletContext)

(3)ServletContext在Web服务器启动时创建,服务器关闭时销毁

1.2 获取ServletContext对象

  • GenericServlet提供了getServletContext(()方法。推荐使用this.getServletContext();
  • HttpServletRequest提供了getServletContext()方法。推荐使用
  • HttpSession提供了getServletContext()方法。

1.3 ServletContext作用

1.3.1 获取项目真实路径

获取当前项目在服务器发布的真实路径

String realpath = servletContext.getRealPath("/");

1.3.2 获取项目上下文路径

获取当前项目上下文路径(应用程序名称)

System.out.println(servletContext.getContextPath());//上下文路径(应用程序名称)
System.out.println(request.getContextPath);

1.3.3 全局容器

ServletContext拥有作用域,可以存储数据到全局容器中

  • 存储数据:servletContext.setAttribute(“name”,value);
  • 获取数据:servletContext.getAttribute(“name”);
  • 移除数据:servletContext.removeAttribute(“name”);

1.4 ServletContext特点

  • 唯一性:一个应用对应一个ServletContext
  • 生命周期:只要容器不关闭或者应用不卸载,ServletContext就一直存在

1.5 ServletContext应用场景

ServletContext统计当前项目访问次数

//获取ServletContext对象
ServletContext servletContext =request.getServletContext();

//获取ServletContext对象中用于统计项目访问次数的变量
Integer num=(Integer) servletContext.getAttribute("count");

//对count进行判断
if(num==null){
	num=1;
	servletContext .setAttribute("count",num);
}else{
	num++;
	servletContext .setAttribute("count",num);
}
response.getWriter().write("您是本网站的第"+num+"位访客!");

1.6 作用域总结

  • HttpServletRequest:一次请求,请求响应之前有效
  • HttpSession:一次会话开始,浏览器不关闭或不超时之前有效
  • ServletContext:服务启动开始,服务器停止之前有效

过滤器(重要)

1.1 现有问题

在之前的Servlet中,有没有冗余的代码,多个Servlet都要进行编写。

1.2 概念

过滤器(Filter)是处于客户端与服务器目标资源之间的一道过滤技术。

在这里插入图片描述

1.3 过滤器作用

(1)之行地位在Servlet之前,客户端发送请求时,会先经过Filter,再到达目标Servlet;响应时,会根据执行流程再次反向执行Filter

(2)可以解决多个Servlet共性代码的冗余问题(例如:乱码处理、登录验证)

1.4 编写过滤器

Servlet API中提供了一个Filter接口,开发人员编写一个Java类实现了这个接口即可,这个Java类称之为过滤器(Filter)

1.4.1 实现过程

(1)编写Java类实现Filter接口

(2)在doFilter()方法中编写拦截逻辑

(3)设置拦截路径

package cn.lqgx.Filter;

import javax.servlet.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebFilter(filterName = "Filter01")
public class Filter01 implements Filter {
    public void init(FilterConfig config) throws ServletException {
        System.out.println("过滤器初始化方法init()开始执行2:"+config);
    }

    public void destroy() {
        System.out.println("过滤器销毁方法destroy()执行了2......");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        //过滤前
        System.out.println("过滤前......doFilter");
        //放行
        chain.doFilter(request, response);
        //过滤后
        System.out.println("过滤后......doFilter");
    }
}

1.5 过滤器配置

1.5.1 注解配置

在自定义的Filter类上使用注解@WebFilter(value=“/过滤目标资源”)

package cn.lqgx.Filter;

import javax.servlet.*;
import javax.servlet.annotation.*;
import java.io.IOException;

//设置拦截路径:/ServletDemo01 访问/ServletDemo01的时候,会先执行该拦截器
@WebFilter(filterName = "Filter01",value="/ServletDemo01")
public class Filter01 implements Filter {
    public void init(FilterConfig config) throws ServletException {
        System.out.println("过滤器初始化方法init()开始执行2:"+config);
    }

    public void destroy() {
        System.out.println("过滤器销毁方法destroy()执行了2......");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        //过滤前
        System.out.println("过滤前......doFilter");
        //放行
        chain.doFilter(request, response);
        //过滤后
        System.out.println("过滤后......doFilter");
    }
}

1.5.2 过滤器路径

过滤器的路径通常有三种形式:

精确过滤匹配:比如/index.jsp /myservlet1

后缀过滤匹配:比如*.jsp、.html、.jpg

通配符过滤匹配:/*表示拦截所有。注意过滤器不能使用/匹配,/aaa/bbb/*允许

1.6 过滤器链和优先级

1.6.1 过滤器链

客户端对服务器请求之后,服务器调用Servlet之前会执行一组过滤器(多个过过滤器),那么这组过滤器就称为一条过滤器链。

每个过滤器实现某个特定的功能,当第一个Filter的doFilter方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter()方法,则Web服务器会检查FilterChain对象中是否还有Filter,如果有,则调用第2个Filter,如果没有,则调用目标资源。

在这里插入图片描述

1.6.2 过滤器优先级

在一个Web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。优先级:

  • 如果为注解的话,是按照类全名称的字母顺序决定作用顺序。
  • 如果为web.xml,按照filter-mapping注册顺序,从上往下
  • web.xml配置高于注解方式
  • 如果注解和web.xml同时配置,会创建多个过滤器对象,造成过滤多次

1.7 过滤器典型应用

1.7.1 过滤器解决编码


1.7.2 权限验证

ShowAllAdminController类


CheckFilter类


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

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

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

相关文章

BM30 二叉搜索树与双向链表

题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示: 数据范围:输入二叉树的节点数0≤n≤1000,二叉树中每个节点的值0≤val≤1000. 要求:空间复杂度O(1)(即在原树上操作&#x…

低代码对比分析,从工程化上看产品的优劣

低代码算是这几年在IT行业内越来越尖锐的讨论了,而且随着这两年大厂的大量裁员,更是亲者痛仇者快的事情,因为很多大厂发现把一些低端的研发岗位干掉了,反而整个体系在工具的辅助运转下,效率更高,执行力更优…

【Python数据分析】Python模拟登录(一) requests.Session应用

最近由于某些原因,需要用到Python模拟登录网站,但是以前对这块并不了解,而且目标网站的登录方法较为复杂, 所以一下卡在这里了,于是我决定从简单的模拟开始,逐渐深入地研究下这块。 注:本文仅为…

Python学习基础笔记五十九——封装和@property

1、私有属性的一个用法: class Room:def __init__(self, name, length, width):self.name nameself.__length lengthself.__width widthdef area(self):return self.__length * self.__widthwei Room(Wei, 2, 1) print(wei.area()) 2、getter和setter&#xf…

Hi3861鸿蒙物联网项目实战:智能照明灯

华清远见FS-Hi3861开发套件,支持HarmonyOS 3.0系统。开发板主控Hi3861芯片内置WiFi功能,开发板板载资源丰富,包括传感器、执行器、NFC、显示屏等,同时还配套丰富的拓展模块。开发板配套丰富的学习资料,包括全套开发教程…

第十篇 1+X考证 Web前端测试题(新)

单选题 1、关于HTML和CSS以下说法错误的是( D ) A、HTML标签中属性的值一定要用双引号或单引号括起来B、HTML空元素要有结束的标签或于开始的标签后加上"/"C、结构与样式完全分离时,结构代码中不涉及任何的样式元素,如f…

Qt之软键盘的实现

文章目录前言一、基于中文汉字数据库1、核心代码2、效果二、基于谷歌拼音输入引擎1、核心代码2、效果前言 Qt5.8版本开始推出了基于QML实现的软键盘功能,在此之前,并没有官方版本的软键盘。本篇主要介绍Qt实现软键盘的两种方案,一种基于中文汉…

[python][GUI]pyside6

------------------------------------------------------------------------------------------------------------------ #非常好资料和教程: 1. Module Index - Qt for Python 2. muziing/PySide6-Code-Tutorial: 可能是最好的PySide6中文教程!用代…

Spring boot 日志直接推送到elasticsearch上

Spring boot 日志直接推送到elasticsearch前言核心依赖elasticsearch配置文件1.url格式如下2.index索引前缀 "xxx"3.maxMessageSize参数数据内容最大值,本文未使用(默认值-1全部数据接收)如下4.BasicAuthentication.java 重写该类用…

详解opencv库函数ellipse()

opencv库函数ellipse()函数可以画扇形,也可以画椭圆。画扇形时只需要将椭圆的长短轴长度设为相同并给定扇形的圆心角即可。 # 参数 1.目标图片 2.椭圆圆心 3.长短轴长度 4.偏转角度 5.圆弧起始角度 6.终止角度 7.颜色 8.是否填充 cv2.ellipse(img_p, (500, 2…

[python] PyMouse、PyKeyboard用python操作鼠标和键盘

1、PyUserInput 简介 PyUserInput是一个使用python的跨平台的操作鼠标和键盘的模块,非常方便使用。支持的平台及依赖如下: Linux - XlibMac - Quartz, AppKitWindows - pywin32, pyHook 支持python版本:我用的是3.6.7 2、安装 直接源码安装…

越南猫年来袭!2023Lazada年货节热销品趋势

距离2023年春节倒计时23天!大家是否对春节假期已经满怀期待了?越南人也和我们一样正期盼着新年到来,越南所有的传统节日都是按照农历来算的,其中春节也是越南重大的节日。春节将至,提前置办年货成了越南人和华人必不可…

MySQL 表的增删改查(进阶篇②)· 联合查询 内连接 外连接 · 自连接 · 子查询 exists · 合并查询 union

接进阶篇①,我们继续学习。 一、联合查询1.1 内连接1.2 外连接1.3 内连接和左右外连接的区别二、自连接三、子查询3.1 单行子查询3.2 多行子查询使用 in 范围匹配多行另一种写法 exists两种写法的区别3.3 在 from 子句中使用子查询四、合并查询unionunion all一、联…

随谈_前端与后端

文章目录一、前言二、前后端分别是什么?2.1. 前端(front end)2.2. 后端(back end)一、前言 最近在学习Vue,打算边学边用,开发一个网页系统。 Vue的话,网上介绍很多,简单…

容器安全的三大挑战

容器凭借其经济高效的优势改变了应用程序的交付方式,随着容器的普遍使用,管理应用程序基础设施的 IT 劳动力和资源也显著减少。然而,在保护容器和容器化生态系统时,软件团队遇到了许多障碍。尤其是习惯于更传统的网络安全流程和策…

MYSQL学习之路

MYSQL架构示意图 MYSQL8.0开始移除了查询缓存这个模块; 查询缓存:适合读多写少的任务; 建议:将 have_query_cache 设置为No,在需要使用查询缓存的语句上显式声明; select SQL_CACHE * from test;WAL(Write …

mysql sql优化、查看索引、创建索引

1.索引遵循原则 仅在被频繁检索的字段上创建索引。针对大数据量的表创建索引,而不是针对只有少量数据的表创建索引。通常来说,经常查询的记录数目少于表中总记录数据的 15% 时,可以创建索引。这个比例并不绝对,它与全表扫描速度成…

java:jackson 一:Jackson Annotation

java:jackson 一:Jackson Annotation 1 前言 参考文档地址: https://www.baeldung.com/jacksonhttps://www.baeldung.com/jackson-annotations2 使用 2.1 Jackson Serialization Annotations jackson 序列化注解 2.1.1 JsonAnyGetter T…

产业互联网是以大数据、云计算、AI等为代表的数字技术的出现为标志

事实上,以往,我们所经历的那个互联网玩家频出的年代,其实就是一个以互联网技术为主导的年代。在那样一个年代里,互联网技术几乎是解决一切痛点和难题的万能解药,几乎是破解一切行业痛点和难题的杀手锏。任何一个行业&a…

数据可视化③:大学生就业数据分析

大学生就业是和我们息息相关的话题,每一位大学生都关注着,我们常常在网络上看到有关大学生就业的话题,比如毕业季的一些讨论。在大一的创新创业课中,我们也了解到自己所学的专业和以后如何就业,往哪方面就业。但我们了…