【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 过滤器:实现请求的预处理与后处理

<前文回顾>

点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、过滤器:Servlet 的“门神”

在 JavaWeb 开发里,Servlet 过滤器[1] 就像个“门神”,专门在请求进门前“查岗”,在响应出门前“把关”。它能对请求和响应进行“预处理”和“后处理”,比如权限验证、日志记录、字符编码啥的。过滤器虽然“低调”,但它的作用可不容小觑。

1. 过滤器的“三板斧”

过滤器的主要功能可以概括为“三板斧”:

  1. 预处理请求:在请求到达 Servlet 之前,对请求进行一些“加工”,比如设置字符编码、验证权限啥的。
  2. 拦截请求:根据条件决定是否放行请求,比如权限不足时直接返回错误页面。
  3. 后处理响应:在响应返回给客户端之前,对响应进行一些“修饰”,比如压缩内容、添加响应头啥的。

Java Code

public class MyFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)

        throws IOException, ServletException {

        // 预处理请求

        req.setCharacterEncoding("UTF-8");

        

        // 拦截请求

        if (checkPermission(req)) {

            chain.doFilter(req, resp); // 放行请求

        } else {

            ((HttpServletResponse) resp).sendError(HttpServletResponse.SC_FORBIDDEN, "权限不足");

        }

        

        // 后处理响应

        resp.setContentType("text/html;charset=UTF-8");

    }

    

    private boolean checkPermission(ServletRequest req) {

        // 权限验证逻辑

        return true;

    }

}

2. 过滤器的“生命周期”

过滤器的生命周期和 Servlet 差不多,主要分三步:initdoFilterdestroy

  • init:过滤器初始化时调用,通常用来加载配置、初始化资源啥的。
  • doFilter:每次请求时调用,是过滤器的核心方法。
  • destroy:过滤器销毁时调用,通常用来释放资源啥的。

Java Code

public void init(FilterConfig config) throws ServletException {

    // 初始化代码

}

public void destroy() {

    // 清理代码

}

二、过滤器的“实际应用场景”

过滤器虽然“低调”,但它的应用场景可不少。比如权限验证、日志记录、字符编码啥的,都能用过滤器来实现。

1. 权限验证

权限验证是过滤器的“拿手好戏”。比如,用户访问某个页面时,过滤器可以“查岗”,看看用户有没有权限,没权限就直接“拦下”。

Java Code

public class AuthFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)

        throws IOException, ServletException {

        HttpServletRequest httpReq = (HttpServletRequest) req;

        HttpSession session = httpReq.getSession();

        if (session.getAttribute("user") == null) {

            ((HttpServletResponse) resp).sendRedirect("login.jsp");

        } else {

            chain.doFilter(req, resp);

        }

    }

}

2. 日志记录

日志记录是过滤器的“家常便饭”。比如,每次请求时,过滤器可以“记一笔”,把请求的 URL、参数啥的都记录下来。

Java Code

public class LogFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)

        throws IOException, ServletException {

        HttpServletRequest httpReq = (HttpServletRequest) req;

        System.out.println("请求 URL: " + httpReq.getRequestURL());

        System.out.println("请求参数: " + httpReq.getQueryString());

        chain.doFilter(req, resp);

    }

}

3. 字符编码

字符编码是过滤器的“基本功”。比如,每次请求时,过滤器可以“统一”设置字符编码,避免乱码问题。

Java Code

public class EncodingFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)

        throws IOException, ServletException {

        req.setCharacterEncoding("UTF-8");

        resp.setContentType("text/html;charset=UTF-8");

        chain.doFilter(req, resp);

    }

}

三、过滤器的“历史”:从 Servlet 2.3 到 Servlet 4.0

过滤器从 Servlet 2.3 开始就有了,虽然现在 Servlet 4.0 已经“普及”了,但过滤器的“核心功能”依然没变。

1. Servlet 2.3:初代“门神”

Servlet 2.3 在 2001 年发布,过滤器是它的“初代门神”。虽然功能简单,但已经能满足大部分开发需求了。

2. Servlet 3.0:引入注解

Servlet 3.0 在 2009 年发布,引入了注解[2],让开发者能用注解配置过滤器,不用再写 web.xml 了。注解的引入,让过滤器的“玩法”更加方便。

Java Code

@WebFilter("/admin/*")

public class AuthFilter implements Filter {

    // 过滤器代码

}

3. Servlet 4.0:支持 HTTP/2

Servlet 4.0 在 2017 年发布,支持 HTTP/2[3],让 Web 应用的性能更上一层楼。HTTP/2 的引入,让过滤器的“玩法”更加高效。

四、过滤器的“骚操作”

1. 请求压缩

过滤器不仅能“查岗”,还能“修饰”响应。比如,用过滤器压缩响应内容,减少传输数据量。

Java Code

public class CompressionFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)

        throws IOException, ServletException {

        HttpServletResponse httpResp = (HttpServletResponse) resp;

        httpResp.setHeader("Content-Encoding", "gzip");

        chain.doFilter(req, new GZIPResponseWrapper(httpResp));

    }

}

2. 响应缓存

过滤器不仅能“修饰”响应,还能“缓存”响应。比如,用过滤器缓存响应内容,减少服务器压力。

Java Code

public class CacheFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)

        throws IOException, ServletException {

        HttpServletResponse httpResp = (HttpServletResponse) resp;

        httpResp.setHeader("Cache-Control", "max-age=3600");

        chain.doFilter(req, resp);

    }

}

3. 跨域处理

过滤器不仅能“缓存”响应,还能“处理”跨域。比如,用过滤器添加跨域响应头,支持跨域请求。

Java Code

public class CorsFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)

        throws IOException, ServletException {

        HttpServletResponse httpResp = (HttpServletResponse) resp;

        httpResp.setHeader("Access-Control-Allow-Origin", "*");

        httpResp.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");

        chain.doFilter(req, resp);

    }

}

专有名词解释

  1. Servlet 过滤器:一种用于在请求到达 Servlet 之前或响应返回客户端之前进行处理的组件。
  2. 注解:Annotation,一种用于配置过滤器的元数据。
  3. HTTP/2:HTTP 协议的第二个主要版本,支持多路复用、头部压缩等特性。

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

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

相关文章

Linux16-数据库、HTML

数据库&#xff1a; 数据存储&#xff1a; 变量、数组、链表-------------》内存 &#xff1a;程序运行结束、掉电数据丢失 文件 &#xff1a; 外存&#xff1a;程序运行结束、掉电数据不丢失 数据库&#xff1a; …

uniapp实现的个人中心页面(仿小红书)

采用 uniapp 实现的一款仿小红书个人中心页面模板&#xff0c;支持vue2、vue3, 同时适配H5、小程序等多端多应用。 简约美观大方 可到插件市场下载尝试&#xff1a; https://ext.dcloud.net.cn/plugin?id22516 示例

【运维篇】KubeSphere-02(经验汇总)

一、使用建议 1.对于数据库、对像存储比较重的要不能丢失&#xff0c;有异地存储备份需求的有状态服务&#xff0c;不建议采用k8s进行部署&#xff0c;会导致运维难度更大。 2.对于中间件如redis、MQ、harbor、seata、nacos、zookeeper可采用k8s部署。 3.对于无状态服务tomc…

基于单片机及传感器的机器人设计与实现

摘要 : 本设计基于单片机及多种传感器 , 完成了一个自主式移动机器人的制作。单片机作为系统检测和控制的核心 , 实现对机器人小车的智能控制。反射式红外光电传感器检测引导线, 使机器人沿轨道自主行走 ; 使用霍尔集成片 , 通过计车轮转过的圈数完成机器人行走路程测量; …

SQLiteStudio:一款免费跨平台的SQLite管理工具

SQLiteStudio 是一款专门用于管理和操作 SQLite 数据库的免费工具。它提供直观的图形化界面&#xff0c;简化了数据库的创建、编辑、查询和维护&#xff0c;适合数据库开发者和数据分析师使用。 功能特性 SQLiteStudio 提供的主要功能包括&#xff1a; 免费开源&#xff0c;可…

SpringBoot过滤器(Filter)的使用:Filter接口、FilterRegistrationBean类配置、@WebFilter注释

1、过滤器(Filter)的介绍 Spring Boot 的过滤器用于对数据进行过滤处理。通过 Spring Boot 的过滤器,程序开发人员不仅可以对用户通过 URL 地址发送的请求进行过滤处理(例如:过滤一些错误的请求或者请求中的敏感词等),而且可以对服务器返回的数据进行过滤处理(例如:压…

第11章 web应用程序安全(网络安全防御实战--蓝军武器库)

网络安全防御实战--蓝军武器库是2020年出版的&#xff0c;已经过去3年时间了&#xff0c;最近利用闲暇时间&#xff0c;抓紧吸收&#xff0c;总的来说&#xff0c;第11章开始学习利用web应用程序安全&#xff0c;主要讲信息收集、dns以及burpsuite&#xff0c;现在的资产测绘也…

PQL查询和监控各类中间件

1 prometheus的PQL查询 1.1 Metrics数据介绍 prometheus监控中采集过来的数据统一称为Metrics数据&#xff0c;其并不是代表具体的数据格式&#xff0c;而是一种统计度量计算单位当需要为某个系统或者某个服务做监控时&#xff0c;就需要使用到 metrics prometheus支持的met…

23年以后版本pycharm找不到conda可执行文件解决办法

这个问题很痛苦&#xff0c;折磨了我半天。 就是链接远程服务器的时候 就一直以为这三个都要配置 就这个conda环境这里怎么都找不到服务器的虚拟环境的python可执行文件&#xff0c;非常痛苦。 后面查找了资料&#xff0c;找了好久&#xff0c;才发现&#xff0c;原来只需要配…

后智能体时代的LLM和Agent

文章目录 1. 关于AI重塑的哲学体系2. 关于AI大模型体系的认知3. 关于AI大模型体系的畅想4. 关于人和AI大模型体系的共处5. 写在最后 随着OpenAI、Deepseek、Manus等等智能体的爆火&#xff0c;人们茶前饭后、插科打诨的话题都离不开这些智能体&#xff0c;现状也正如《人民日报…

QTreeWidget指定子节点弹出菜单

方法&#xff1a;判断父对象 connect(ui->treeWidget_nav, &QTreeWidget::itemChanged, [](QTreeWidgetItem *TWI){if (TWI->parent() TWI_bookmark) {qDebug() << TWI->data(0, LOCATION_OF_REAL_PATH).toString() << TWI->text(0);} }); ui->…

R语言使用scitable包交互效应深度挖掘一个陌生数据库

很多新手刚才是总是觉得自己没什么可以写的&#xff0c;自己不知道选什么题材进行分析&#xff0c;使用scitable包后这个完全不用担心&#xff0c;选题多到你只会担心你写不完&#xff0c;写得不够快。 今天演示一下使用scitable包深度挖掘一个陌生数据库 先导入R包和数据 li…

神经网络|(十五)|霍普菲尔德神经网络-Storkey 训练

【1】引言 前序学习进程中&#xff0c;对霍普菲尔德神经网络有了初步认识&#xff0c;使用Hebbian方法测试了霍普菲尔德神经网络算法。相关学习文章链接为&#xff1a; 神经网络|(十四)|霍普菲尔德神经网络-CSDN博客 在此基础上&#xff0c;尝试探索使用Storkey方法对霍普菲…

算法006——和为S 的两个数

力扣——查找总价格为目标值的两个商品点击跳转 注意题目中的关键信息升序 我们利用双指针&#xff0c;不管 target 是多少&#xff0c;让一个指针指向最小值&#xff0c;让一个指针指向最大 那么&#xff0c;共有三种情况 我们首先遇到的是第二种情况 sum < target left …

【推荐项目】039-酒店预定系统

039-酒店预定系统 介绍 Java ssm 酒店预定管理系统 针对您提出的酒店预定系统&#xff0c;以下是一个基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架与JSP技术的功能结构整理&#xff0c;该系统分为管理端与用户端两大模块&#xff1a; 一、管理端功能 个…

从0开始,手搓Tomcat

一、什么是Tomcat Tomcat 是一款开源的、轻量级的 Web 服务器&#xff0c;它不仅能够提供 HTTP 服务&#xff0c;还能够运行 Java Servlet 和 JavaServer Pages&#xff08;JSP&#xff09;。对于许多开发者来说&#xff0c;理解 Tomcat 的目录结构以及如何在该结构中组织应用…

Ubuntu虚拟机中使用QEMU搭建ARM64环境

Ubuntu虚拟机中使用QEMU搭建ARM64环境 通过本实验学习如何编译一个 ARM64 版本的内核 image&#xff0c;并且在QEMU 上运行起来。 文章目录 Ubuntu虚拟机中使用QEMU搭建ARM64环境一、安装aarch64交叉编译工具二、安装QEMU三、制作根文件系统1、根文件系统简介2、BusyBox构建根…

java 重点知识 — JVM存储模块与类加载器

1 jvm主要模块 方法区 存储了由类加载器从.class文件中解析的类的元数据&#xff08;类型信息、域信息、方法信息&#xff09;及运行时常量池&#xff08;引用符号及字面量&#xff09;。 所有线程共享&#xff1b;内存不要求连续&#xff0c;可扩展&#xff0c;可能发生垃圾回…

Windows 如何开启和使用FTP服务

在Windows 系统开启FTP的服务方式有很多种&#xff0c;最快速的就是使用Windows自身的FTP服务了。 Windows 搭建FTP服务的方式 在Windows 中搭建FTP的方式有很多种&#xff0c;有商用收费的&#xff0c;也有开源免费的&#xff0c;除此之外&#xff0c; Windows本身也内置了F…

ASP.NET Core 6 MVC 文件上传

概述 应用程序中的文件上传是一项功能&#xff0c;用户可以使用该功能将用户本地系统或网络上的文件上传到 Web 应用程序。Web 应用程序将处理该文件&#xff0c;然后根据需要对文件进行一些验证&#xff0c;最后根据要求将该文件存储在系统中配置的用于保存文件的存储中&#…