深入剖析Java Web开发中的过滤器、拦截器和AOP

news2024/9/24 15:24:22

Alt

文章目录

    • 1. 过滤器(Filter)
      • 1.1 过滤器的概念
      • 1.2 过滤器的应用场景
      • 1.3 过滤器的示例代码
    • 2. 拦截器(Interceptor)
      • 2.1 拦截器的概念
      • 2.2 拦截器的应用场景
      • 2.3 拦截器的示例代码
    • 3. AOP(面向切面编程)
      • 3.1 AOP的概念
      • 3.2 AOP的应用场景
      • 3.3 AOP的示例代码
    • 4. 过滤器、拦截器和AOP的协同工作机制

🎈个人主页:程序员 小侯
🎐CSDN新晋作者
🎉欢迎 👍点赞✍评论⭐收藏
✨收录专栏:Java基础
✨文章内容:区别、应用场景和协同工作机制
🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗

在Java Web开发中,过滤器、拦截器和AOP(面向切面编程)是常用的增强应用程序功能和处理请求的机制。本文将深入研究这三个关键的概念,探讨它们的区别、应用场景以及如何协同工作,同时提供代码示例进行更具体的说明。

1. 过滤器(Filter)

在这里插入图片描述

1.1 过滤器的概念

过滤器是Servlet技术中的一种组件,用于在请求到达Servlet之前或响应离开Servlet之后,对请求或响应进行预处理或后处理。过滤器通常用于执行一些通用的任务,如日志记录、验证用户身份、字符编码转换等。

1.2 过滤器的应用场景

  • 请求日志记录:记录请求的信息,如请求URL、参数等。
  • 权限验证:检查用户是否有权限访问特定资源。
  • 字符编码转换:确保请求和响应的字符编码一致。

1.3 过滤器的示例代码

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class LoggingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化过滤器
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 执行过滤操作前的逻辑
        System.out.println("Request logging: " + request.getRemoteAddr() + " " + request.getParameter("param"));

        // 调用链中的下一个过滤器或目标资源
        chain.doFilter(request, response);

        // 执行过滤操作后的逻辑
        System.out.println("Response logging: " + response.getContentType());
    }

    @Override
    public void destroy() {
        // 销毁过滤器
    }
}

2. 拦截器(Interceptor)

在这里插入图片描述

2.1 拦截器的概念

拦截器是Spring框架中的一部分,用于在方法调用前后、异常抛出前后执行一些操作。拦截器常用于处理事务、日志记录、权限验证等场景。

2.2 拦截器的应用场景

  • 日志记录:记录方法调用的信息,如方法名、参数等。
  • 事务管理:处理方法的事务提交和回滚。
  • 权限验证:验证用户是否有权限执行某个方法。

2.3 拦截器的示例代码

public class LoggingInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 在方法调用前执行的逻辑
        System.out.println("Before method execution: " + ((HandlerMethod) handler).getMethod().getName());
        return true; // 返回true表示继续执行方法,返回false表示阻止方法执行
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) {
        // 在方法调用后执行的逻辑
        System.out.println("After method execution: " + ((HandlerMethod) handler).getMethod().getName());
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                Exception ex) {
        // 在方法调用完成后执行的逻辑
        System.out.println("After method completion: " + ((HandlerMethod) handler).getMethod().getName());
    }
}

3. AOP(面向切面编程)

在这里插入图片描述

3.1 AOP的概念

AOP是一种编程范式,它将横切关注点(如日志、事务、权限等)从应用程序的主业务逻辑中分离出来。通过在代码

中定义切点(指定在何处应用横切关注点)和通知(指定在何时执行横切关注点),AOP实现了对横切关注点的模块化管理。

3.2 AOP的应用场景

  • 日志记录:在方法执行前后记录日志。
  • 事务管理:处理方法的事务提交和回滚。
  • 性能监控:记录方法的执行时间。
  • 缓存管理:在方法调用前检查缓存中是否存在结果。

3.3 AOP的示例代码

@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        // 在方法调用前执行的逻辑
        System.out.println("Before method execution: " + joinPoint.getSignature().getName());
    }

    @After("execution(* com.example.service.*.*(..))")
    public void logAfter(JoinPoint joinPoint) {
        // 在方法调用后执行的逻辑
        System.out.println("After method execution: " + joinPoint.getSignature().getName());
    }
}

4. 过滤器、拦截器和AOP的协同工作机制

  • 过滤器和拦截器:过滤器是基于Servlet规范的,而拦截器是Spring框架提供的。它们在请求的不同生命周期中执行。过滤器在请求的生命周期内只执行一次,而拦截器在方法调用前后、异常抛出前后都可以执行。

  • 拦截器和AOP:拦截器主要用于对方法的前后执行进行拦截,而AOP更强大,可以精确地定义在何处和何时执行横切关注点。AOP通过切点和通知的方式实现,更为灵活。

  • 过滤器、拦截器和AOP的协同工作:在Java Web应用中,可以同时使用过滤器和拦截器来完成对请求的处理。过滤器主要负责对请求进行预处理,而拦截器在方法调用前后执行。AOP可以与拦截器协同工作,通过定义切面在方法调用前后执行。
    在这里插入图片描述
    通过这三者的组合使用,我们可以更好地管理和维护Java Web应用,实现更加模块化和可维护的代码结构。

后记 👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

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

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

相关文章

element UI改写时间线组件为左右分布

2023.12.4今天我学习了如何使用element的时间线组件,效果如: 代码如下:(关键代码 v-if"item.send_type")判断左右分布情况。因为如果没有这个判断的话,其实会两边都有显示。可以用一个判断表示0显…

SQL Sever 基础知识 - 数据筛选(2)

SQL Sever 基础知识 - 四、数据筛选 第3节 NULL3.1 NULL 和三值逻辑3.2 IS NULL / IS NOT NULL 第4节 AND4.1 AND 运算符简介4.2 AND 运算符示例4.2.1 一个 AND 运算符4.2.2 多个 AND 运算符4.2.3 将 AND 运算符与其他逻辑运算符一起使用 第5节 OR5.1 OR 运算符简介5.2 OR 运算…

RH850P1X芯片学习笔记-Overview

文章目录 Outline产品列表功能框图特点Pin和引脚功能CPU系统CPUFPU浮点运算单元中断处理保护机制指令缓存Local RAMGlobal RAM处理器间通信和相互排斥机制 操作模式中断功能DMA电源供电Reset控制单元时钟控制单元CSIH-SPIMCAN看门狗计时器系统计时器GTM通用定时器模块外设互联P…

vue3 vue-router过渡动效 滚动行为 (四)

文章目录 一、过渡动效1.1安装animate.css1.2 利用元信息存储过渡名称1.3 在组件中使用 二、滚动行为2.1 始终滚动到顶部2.2 相对于某个元素的偏移量2.3 保持之前的滚动位置 一、过渡动效 1.1安装animate.css npm install animate.css --save1.2 利用元信息存储过渡名称 {pa…

【Element】el-table组件使用summary-method属性设置表格底部固定两行并动态赋值

一、背景 需求:在表格账单中底部添加两行固定行,来统计当前页小计和总计。element ui 官网上是直接将本列所有数值进行求合操作的,且只有固定一行总计。目前的需求是将接口返回的数据填充到底部固定的两行中 二、底部添加两行固定行 2.1、…

一元月老盲盒交友小程序源码系统 源码全部开源可二次开发 附带完整的搭建教程

传统的交友平台存在很多问题,如信息不透明、虚假信息等。这些问题不仅影响了用户的交友体验,也损害了交友平台的信誉。为了解决这些问题,罗峰给大家介绍一款一元月老盲盒交友小程序源码系统。该系统结合了盲盒和交友两个元素,通过…

赛事回顾 | 首届“智航杯“全国无人机智能算法竞赛落幕

11月28日,首届“智航杯”全国无人机智能算法竞赛实物赛在海南省三亚市成功落下帷幕。此次竞赛自2023年4月启动以来,共有来自全国145所高等院校和50多所企事业单位的1253支团队、3655人报名参赛,最终有6支队伍脱颖而出,入围了实物赛…

IPD|企业产品研发的致胜法宝——TR技术评审

前言 企业产品研发过程中,我们总能听到类似这样一些声音: 技术评审效率太低,一开就是半天,也没啥结果; 团队里都是技术骨干,不用评审了; 已有决策评审了,技术评审就是浪费时间&a…

如何将四元数转换为旋转矩阵

什么是四元数? 四元数是表示物体在三维空间中的方向和旋转的几种数学方法之一。另一种方法是使用基于欧拉角的旋转矩阵,即滚动、俯仰和偏航,就像的封面图片。 通常使用四元数代替欧拉角旋转矩阵,因为“与 旋转矩阵相比 &#xff…

备考软件测试

单元测试 语句覆盖所有条件执行一次 判定覆盖所有条件错一次对一次 条件覆盖小条件对错各一次 判断条件覆盖每个小条件对错各一次的基础上再加上两个大条件对错各一次 多条件覆盖(组合覆盖) 每个小条件对应另一个小条件要对一次错一次比如:A<5对一次要对应B5对一次错一次…

FileUtil工具类

【版权所有&#xff0c;文章允许转载&#xff0c;但须以链接方式注明源地址&#xff0c;否则追究法律责任】【创作不易&#xff0c;点个赞就是对我最大的支持】 前言 仅作为学习笔记&#xff0c;供大家参考 总结的不错的话&#xff0c;记得点赞收藏关注哦&#xff01; 目录 …

8.7 矢量图层点要素点分布(Point displacement)使用

文章目录 前言点分布&#xff08;Point displacement&#xff09;QGis代码实现 总结 前言 前面介绍了矢量-点要素-单一符号、矢量-点要素-分类符号、矢量-点要素-分级符号以及矢量-点要素-基于规则的使用本章介绍如何使用点分布&#xff08;Point displacement&#xff09;说明…

12、pytest上下文友好的输出

官方实例 # content of test_assert2.py import pytestdef test_set_comparison():set1 set("1308")set2 set("8035")assert set1 set2def test_dict_comparison():dict_1 {name:陈畅,sex:男}dict_2 {name:赵宁,sex:女}assert dict_1 dict_2def tes…

19、pytest通过mark标记测试函数

官方实例 [pytest] markers slow:marks tests as slow(deselect with -m "not slow")serial# content of test_mark.py import pytestpytest.mark.slow def test_mark_function():print("test_mark_function was invoked")assert 0解读与实操 通过使用p…

netcore swagger 错误 Failed to load API definition

后端接口报错如下&#xff1a; 前端nswag报错如下&#xff1a; 根据网上查询到的资料说明&#xff0c;说一般swagger这种错误都是控制器里有接口代码异常造成的&#xff0c;通常是接口没有加属性Attribute&#xff0c; 比如[HttpPost("Delete")]、[HttpGet("Del…

failed to install plugin grafana 插件安装失败

升级时忽略plugins 权限问题&#xff0c;导致安装插件失败&#xff01;调整权限即可

你知道和不知道的微信小游戏常用API整理,赶紧收藏用起来~

引言 这…已收藏 最近在书院(一个提供优质内容&#xff0c;专门搞学习的地方,可私信“星球”了解和捧场)看到比较多的星友想学习Cocos进行小游戏开发。 “该从什么方向入手&#xff1f;” 从星友们的主题可以看出&#xff0c;小游戏目前不管是国内还是海外&#xff0c;都非常…

Node 后端 框架 Nest js鉴权

使用 nest g res auth去生成restful风格的auth模块&#xff0c;下面是具体操作 nest g res auth安装基础依赖 {"name": "auth","version": "0.0.1","description": "","author": "","…

第四节 数组

第四节 数组 目录 一&#xff0e; 一维数组的创建和初始化1. 一维数组的创建2. 数组的初始化3. 一维数组的使用4. 一维数组在内存中的存储 二&#xff0e; 二维数组的创建和初始化1. 二维数组的创建2. 二维数组的初始化3. 二维数组的使用4. 二维数组在内存中的存储 三&#xff…

梯度上升和随机梯度上升

目录 梯度上升算法&#xff1a; 代码&#xff1a; 随机梯度上升算法&#xff1a; 代码&#xff1a; 实验&#xff1a; 做图代码&#xff1a; 疑问&#xff1a; 1.梯度上升算法不适应大的数据集&#xff0c;改用随机梯度上升更合适。 2.改进过的随机梯度算法&#xff0…