【SpringBoot】过滤器,监听器,拦截器介绍

news/2024/12/21 19:07:29/

文章目录

    • 一、简介
      • 1、过滤器
      • 2、拦截器
      • 3、监听器
    • 二、如何创建
      • 1、过滤器
      • 2、监听器
      • 3、拦截器
    • 三、总结

一、简介

在这里插入图片描述

在这里插入图片描述

通过两幅图我们可以理解拦截器和过滤器的特点

1、过滤器

过滤器是在请求进入tomcat容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

理解上面这句话我们就可以知道,进入servlet之前,主要是两个参数:ServletRequest,ServletResponse 那我们得到这两个测试可以干哪些事呢?

我们可以通过ServletRequest得到HttpServletRequest,此时你就可以对请求或响应(Request、Response)那就可以对对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息、字符集统一等一些高级功能。它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。(每次热部署后,都会销毁)。

2、拦截器

从上图我们可以看出过滤器只在servlet前后起作用,所以它既不能捕获异常,获得bean对象等,这些是只能是进入servlet里面的拦截器能过做到。拦截器中用于在某个方法或字段被访问之前,进行拦截然后,在之前或之后加入某些操作。比如日志,安全等。一般拦截器方法都是通过动态代理的方式实现。可以通过它来进行权限验证,或者判断用户是否登陆,或者是像12306 判断当前时间是否是购票时间。

对比一下其实我们可以发现,过滤器能做的事拦截器都能做,二拦截器做的事过滤器不一定做的了。

3、监听器

listener是servlet规范中定义的一种特殊类。用于监听servletContext、HttpSession和servletRequest等域对象的创建和销毁事件。监听域对象的属性发生修改的事件。用于在事件发生前、发生后做一些必要的处理。其主要可用于以下方面:

  • 1、统计在线人数和在线用户
  • 2、系统启动时加载初始化信息
  • 3、统计网站访问量
  • 4、记录用户访问路径。

常用的监听器 servletContextListener、httpSessionListener、servletRequestListener)

二、如何创建

1、过滤器

自定义Filter 使用Servlet3.0的注解进行配置第三步的@WebFilter就是3.0的注解

1)启动类里面增加 @ServletComponentScan,进行扫描

2)新建一个Filter类,implements Filter,并实现对应的接口

3)@WebFilter 标记一个类为filter,被spring进行扫描

urlPatterns:拦截规则,支持正则

4)控制chain.doFilter的方法的调用,来实现是否通过放行不放行,web应用resp.sendRedirect("/index.html");场景:权限控制、用户登录(非前端后端分离场景)等

application类

@SpringBootApplication
@ServletComponentScan
public class SpringbootstudyApplication {public static void main(String[] args) {SpringApplication.run(SpringbootstudyApplication.class, args);}
}

LoginFilter过滤器

//过滤器拦截路径
@WebFilter(urlPatterns = "/api/*", filterName = "loginFilter")
public class LoginFilter  implements Filter{/*** 容器加载的时候调用*/@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("拦截器进入========拦截器进入========");}/*** 请求被拦截的时候进行调用*/@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("拦截中========拦截中========");HttpServletRequest hrequest = (HttpServletRequest)servletRequest;HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) servletResponse);if(hrequest.getRequestURI().indexOf("/index") != -1 ||hrequest.getRequestURI().indexOf("/asd") != -1 ||hrequest.getRequestURI().indexOf("/online") != -1 ||hrequest.getRequestURI().indexOf("/login") != -1) {filterChain.doFilter(servletRequest, servletResponse);}else {wrapper.sendRedirect("/login");}}/*** 容器被销毁的时候被调用*/@Overridepublic void destroy() {System.out.println("拦截器销毁========拦截器销毁========");}}

1、官网地址:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners

2、监听器

@WebListener
public class RequestListener implements ServletRequestListener {@Overridepublic void requestDestroyed(ServletRequestEvent sre) {// TODO Auto-generated method stubSystem.out.println("======销毁监听器========");}@Overridepublic void requestInitialized(ServletRequestEvent sre) {System.out.println("======进入监听器========");}

3、拦截器

CustomWebMvcConfigurer主拦截器需要:

1:添加@Configuration注解2:实现WebMvcConfigurer接口
//主拦截器,根据拦截不同路径跳转不同自定义拦截器 (实现WebMvcConfigurer方法)
@Configuration
public class CustomWebMvcConfigurer implements WebMvcConfigurer  {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/api1/*/**");registry.addInterceptor(new TwoIntercepter()).addPathPatterns("/api2/*/**");//.excludePathPatterns("/api2/xxx/**"); //拦截全部 /*/*/**WebMvcConfigurer.super.addInterceptors(registry);}}

LoginIntercepter子拦截器

public class LoginIntercepter implements HandlerInterceptor{/*** 进入controller方法之前*/@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {System.out.println("LoginIntercepter------->preHandle");//        String token = request.getParameter("access_token");
//        
//        response.getWriter().print("fail");return HandlerInterceptor.super.preHandle(request, response, handler);}/*** 调用完controller之后,视图渲染之前*/@Overridepublic void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("LoginIntercepter------->postHandle");HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}/*** 整个完成之后,通常用于资源清理*/@Overridepublic void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("LoginIntercepter------->afterCompletion");HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}}

TwoIntercepter同上

三、总结

最后总解一下他们:

过滤器:用于属性甄别,对象收集(不可改变过滤对象的属性和行为)

监听器:用于对象监听,行为记录(不可改变监听对象的属性和行为)

拦截器:用于对象拦截,行为干预(可以改变拦截对象的属性和行为)


http://www.ppmy.cn/news/86008.html

相关文章

Jupyter notebook 和 Jupyter lab 的区别

Jupyter Notebook和JupyterLab都是用于交互式计算和数据科学的开源工具 它们都是基于Jupyter项目构建的,提供了一种以笔记本形式创建、运行和共享代码、文本和可视化结果的方式。然而,Jupyter Notebook和JupyterLab在用户界面、功能和扩展性方面存在一些…

深入理解hashmap底层实现原理

目录 总体介绍 HashMap元素的存储 在hashmap中添加元素 HashMap的扩容机制 HashMap的线程安全性 1.添加和删除元素时存在不安全性 2.进行扩容操作时存在不安全性 3.哈希冲突存在不安全性 4.线程之间的不可见性导致安全问题 总体介绍 HashMap是我们用于元素映射使用频率最…

android 12.0launcher3中workspace app列表页不显示某个app图标

1.概述 在12.0的开发中,Launcher3 workspace的app列表页 会负责加载系统中app的所有图标 但针对某个不需要显示在桌面的app图标需要过滤掉 所以需要在加载和更新的时候过滤 需要更改两处地方,一处是 加在列表时 一处是安装卸载app 更新app列表时 2.launcher3中workspace ap…

BERT论文核心点记录

BERT适合分类任务(整段分类后者词分类),对生成任务不友好 使用BERT的方法:只需要在预训练好的BERT基础上新增一个输出层,然后用标记好的数据进行有监督微调 Bidirectional Encoder双向Encoder实质上就是指Transforme…

VMware ESXi 6.5 U3 Final - ESXi 6 系列最终版下载

VMware ESXi 6.5 U3 Final - ESXi 6 系列最终版下载 VMware ESXi 6 Standard 请访问原文链接:https://sysin.org/blog/vmware-esxi-6/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org VersionRelease NameRelease …

无需公网IP,在家SSH远程连接公司内网服务器「cpolar内网穿透」

文章目录 视频教程1. Linux CentOS安装cpolar2. 创建TCP隧道3. 随机地址公网远程连接4. 固定TCP地址5. 使用固定公网TCP地址SSH远程 转载自cpolar内网穿透的文章:无公网IP,SSH远程连接Linux CentOS【内网穿透】 本次教程我们来实现如何在外公网环境下&am…

BI技巧丨度量值的动态格式字符串

2023年4月版本新增了度量值的动态格式字符串功能。从字面上看可能小伙伴们不是很理解这个功能的用途,这里白茶给大家解释一下。 通俗一点来说,就是可以在数值中加入文本,将其转化为字符串,而不改变其原有的数据类型。 看到这里&…

使用SMTP协议发送邮件

剧情介绍 今天心血来潮,学了一下Python3,里面有个章节是发送邮件,用示例里面的代码,运行后报错,然后记录一下问题是如何解决的,大家可以看一下,可以有效避坑。 SMTP简介 SMTP是一种提供可靠且…