【java开发】 java web的Filter(过滤器),Interceptor(拦截器) 和 Aspect(切面)

news/2024/11/13 19:07:29/文章来源:https://www.cnblogs.com/o-O-oO/p/18536989

“ 在Java Web开发中,始终离不开Filter,Interceptor,Aspect三个部分,本文将对此进行介绍。”

Filter 是servlet层面的,由Servlet容器(如Tomcat)支持,只能在web程序中使用,实现了javax.servlet.Filter接口

Interceptor 是Spring Web层面的(Structs也有), 它是由Spring容器进行管理,并不依赖Tomcat等容器,既可以应用在web程序中,也可以应用在非web程序中,实现了org.springframework.web.servlet接口

Aspect 是Spring层面的,由Spring容器进行管理,有Spring的地方都可以使用

一、过滤器 (Filter)

过滤器的配置比较简单,直接实现Filter 接口即可,也可以通过@WebFilter注解实现对特定URL拦截,看到Filter 接口中定义了三个方法。
init() :该方法在容器启动初始化过滤器时被调用,它在 Filter 的整个生命周期只会被调用一次。注意:这个方法必须执行成功,否则过滤器会不起作用。
doFilter() :容器中的每一次请求都会调用该方法, FilterChain 用来调用下一个过滤器 Filter。
destroy():当容器销毁 过滤器实例时调用该方法,一般在方法中销毁或关闭资源,在过滤器 Filter 的整个生命周期也只会被调用一次

第一部分的正文内容从这里开始。

@Component
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("Filter 前置");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("Filter 处理中");filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {System.out.println("Filter 后置");}
}

二、拦截器 (Interceptor)

拦截器它是链式调用,一个应用中可以同时存在多个拦截器Interceptor, 一个请求也可以触发多个拦截器 ,而每个拦截器的调用会依据它的声明顺序依次执行。

首先编写一个简单的拦截器处理类,请求的拦截是通过HandlerInterceptor 来实现,看到HandlerInterceptor 接口中也定义了三个方法。

preHandle() :这个方法将在请求处理之前进行调用。注意:如果该方法的返回值为false ,将视为当前请求结束,不仅自身的拦截器会失效,还会导致其他的拦截器也不再执行。

postHandle():只有在 preHandle() 方法返回值为true 时才会执行。会在Controller 中的方法调用之后,DispatcherServlet 返回渲染视图之前被调用。有意思的是:postHandle() 方法被调用的顺序跟 preHandle() 是相反的,先声明的拦截器 preHandle() 方法先执行,而postHandle()方法反而会后执行。

afterCompletion():只有在 preHandle() 方法返回值为true 时才会执行。在整个请求结束之后, DispatcherServlet 渲染了对应的视图之后执行。

@Component
public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("Interceptor 前置");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("Interceptor 处理中");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("Interceptor 后置");}
}

将自定义好的拦截器处理类进行注册,并通过addPathPatterns、excludePathPatterns等属性设置需要拦截或需要排除的 URL。

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**");}
}

三、Aspect(切面)

spring通知有五种类型,分别是:

前置通知(@Before):在目标方法调用之前调用通知
后置通知(@After):在目标方法完成之后调用通知
环绕通知(@Around):在被通知的方法调用之前和调用之后执行自定义的方法
返回通知(@AfterReturning):在目标方法成功执行之后调用通知
异常通知(@AfterThrowing):在目标方法抛出异常之后调用通知
@Aspect
@Component
public class AopAdvice {@Pointcut("execution (* com.xxx.xxx.controller.*.*(..))")public void test() {}@Before("test()")public void beforeAdvice() {System.out.println("beforeAdvice...");}@After("test()")public void afterAdvice() {System.out.println("afterAdvice...");}@Around("test()")public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {System.out.println("before");try {proceedingJoinPoint.proceed();} catch (Throwable t) {t.printStackTrace();}System.out.println("after");}
}

Filter(过滤器),Interceptor(拦截器) 和 Aspect(切面)的区别:

参考🔗

https://mp.weixin.qq.com/s/uBA345GU2anrNmYDbpHXvQ

原创 拥有必珍惜 码农笑江湖

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tesla Model Y refresh All In One

Tesla Model Y refresh All In One Tesla Model Y Juniper / Tesla Model Y 焕新版Tesla Model Y refresh All In OneTesla Model Y Juniper / Tesla Model Y 焕新版demoshttps://www.youtube.com/watch?v=WWou0YzxJ7Yhttps://topelectricsuv.com/news/tesla/2024-tesla-model…

【开源系列】Loki 与 Promtail 实现轻量级日志管理系统

1、简介 Grafana Loki 是一个用于日志聚合和分析的开源工具,专为云原生环境设计,与 Grafana 无缝集成,能够高效地收集、存储和查询日志。以下是如何使用 Grafana Loki 收集日志的详细步骤。 2、环境准备 确保你已经安装了以下组件: Docker(用于容器化部署)Grafana(用于可…

【学习软件】【疯狂地理Beta1.0.0】

【前言】 近期,使用Unity开发了一款有关中国地理知识的App,目前仅支持Android,用于自己学习。知识要活学活用才行。【软件截图】 【下载地址】 https://rere.lanzoue.com/iiblf2eochmh密码:5jvy【敬畏能量 敬畏自然】

Groove Intermediate pg walkthrough

80端口web站点 dirsearch 没发现啥有用信息 感觉就是让我们突破登录框进后台的 https://github.com/ChurchCRM/CRM/issues/137 上网查到默认密码 登录后台跟具cms查exp发现有个SQL注入 payload找半天找到一个 可以直接sql注入 http://192.168.167.44/EventAttendance.php?Act…

easyre 1

easyre 1 下载文件解压发现是个exe文件直接丢进IDA分析flag{this_Is_a_EaSyRe}本文来自博客园,作者:TazmiDev,转载请注明原文链接:https://www.cnblogs.com/tazmi/p/18537488

AtCoder Beginner Contest 379

A - Cyclic 题意输入\(3\)个连续字符\(a,b,c\),输出另外两种顺序。思路模拟。代码点击查看代码 #include<bits/stdc++.h> using namespace std; #define int long long typedef pair<int, int> pii;const int mxn = 1e6 + 5;void solve() {char a, b, c;cin >&…

[NPUCTF2020]ReadlezPHP

打开靶机,看看情况右键想看源代码没反应,关掉设置里的JavaScript即可查看源代码 点进去看看发现源码<?php #error_reporting(0); class HelloPhp {public $a;public $b;public function __construct(){$this->a = "Y-m-d h:i:s";$this->b = "date&q…

gigapath部署以及微调全过程

0.0 什么是gigapathgigapath是一个由微软开发的数字病理学全玻片基础模型,用于从高分辨率图像(如病理切片图像)中提取和处理信息的深度学习模型架构。 图中分为abc三个部分 a 首先输入一张高清的病理图像,我们将它拆分成256*256的图像切片,从而可以逐块处理。 每个图像块会…

【剑侠情缘2网络版单机安装教程】算是完美吧大多数开服用得端+附GM

为了学习和研究软件内含的设计思想和原理,本人花心血和汗水带来了搭建教程!!! 教程不适于服架设,严禁服架设!!!请牢记!!! 教程仅限学习使用,禁止商用,一切后果与本人无关,此声明具有法律效应!!!! 教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给…

Playwright使用Typescript实现在测试case文件中调用另一个文件中的方法

前提: (1)安装了nodejs (2)创建了测试目录 (3)使用Vscode安装了Playwright插件 可以参考官方文档:https://playwright.dev/docs/getting-started-vscode在vscode界面最左侧的按钮选择Explorer, 创建一个与tests目录同级的目录methods,并在methods目录下创建文件method…

#2024-2025-1学号20241309《计算机基础与程序设计》第七周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第七周作业这个作业的目标作业正文 2024-2025-1学号20241309《计算机基础与程序设计》第七周学习总结教材学习内容总结 《计算机科学概论》第八章: 抽象数据…

八、Spring Boot集成Spring Security之前后分离认证最佳实现对接测试

本文介绍前后分离认证最佳实现的对接测试,使用postman或者其他熟悉的测试工具,配合最佳流程介绍和实现效果更佳!!!前言 本文介绍前后分离认证最佳实现的对接测试,使用postman或者其他熟悉的测试工具,配合以下内容观看效果更佳!!!什么是前后分离认证流程最佳方案,为什…