当前位置: 首页 > news >正文

springboot的拦截器,监听器,过滤器,servlet的使用(三大组件)

目录

  • 1. 拦截器
    • 1.1 简介
    • 1.2 使用
  • 2. 监听器
    • 2.1 简介
    • 2.2 使用
  • 3. 过滤器
    • 3.1 简介
    • 3.2 使用
  • 4. servlet
    • 4.1 简介
    • 4.2 使用
  • 5. 例子
  • 6. 心得

1. 拦截器

1.1 简介

Spring Boot 拦截器(Interceptor)是Spring MVC中用于在请求处理流程中执行某些操作的组件。它们允许你在请求到达控制器之前或响应发送回客户端之后插入自定义行为。这可以包括日志记录、身份验证、请求数据转换等。

实现一个Spring Boot拦截器
要创建一个Spring Boot拦截器,你需要遵循以下步骤:

  1. 创建一个拦截器类:实现HandlerInterceptor接口,并重写其方法(如preHandle、postHandle、afterCompletion)。
  2. 注册拦截器:在你的配置类中,通过实现WebMvcConfigurer接口并重写addInterceptors方法来注册你的拦截器。

1.2 使用

实现一下
首先创建一个拦截器类

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("前置拦截");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("后置拦截");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("最终拦截");}}

注册拦截器

@Configuration
public class MyConfig implements WebMvcConfigurer {// 拦截器@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/hello");}
}

说明一下:

  • addInterceptor函数(实际上是一个方法,因为它被定义在InterceptorRegistry接口中,并由WebMvcConfigurer的实现类在配置时调用)的作用是将自定义的拦截器(HandlerInterceptor)注册到Spring MVC的拦截器链中。
  • 通过addPathPatterns方法指定哪些请求路径应该被该拦截器拦截。
  • 通过 excludePathPatterns 方法指定些请求路径应该被排除

在拦截器中可以写一些跳转或者添加一下属性到Model
比如:

2. 监听器

2.1 简介

在Spring Boot中,通常我们更多地依赖于Spring的事件监听机制(ApplicationListener)和Spring MVC的拦截器(Interceptor)来处理请求前后的逻辑,而不是传统的Servlet监听器(如ServletContextListener、HttpSessionListener等)。这是因为Spring Boot和Spring MVC提供了更高级别的抽象和更丰富的功能集,使得开发者能够更专注于业务逻辑的实现。

然而,如果你确实需要在Spring Boot应用中使用Servlet监听器,你仍然可以这样做,因为Spring Boot是建立在Servlet API之上的。

步骤:

  1. 创建Servlet监听器
  2. 注册Servlet监听器

2.2 使用

创建Servlet监听器

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;public class MyListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// 应用程序启动时执行的初始化操作System.out.println("Listener->应用程序已启动");// 加载配置文件、初始化数据库连接池等// ...}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// 应用程序关闭时执行的清理操作System.out.println("Listener->应用程序即将关闭");// 关闭数据库连接池、释放资源等// ...}
}

注册:

@Configuration
public class MyConfig implements WebMvcConfigurer {
@Beanpublic ServletListenerRegistrationBean myListener(){ServletListenerRegistrationBean<MyListener> registrationBean = newServletListenerRegistrationBean(new MyListener());return registrationBean;}
}

3. 过滤器

3.1 简介

在Spring Boot中,过滤器(Filter)是一种能够拦截请求和响应的组件,它可以在请求到达控制器之前或响应发送给客户端之后执行特定的代码。这使得过滤器非常适合用于处理日志记录、身份验证、请求预处理和响应后处理等任务。
Spring Boot 提供了几种方式来注册和使用过滤器,以下是一些常见的方法:

  1. 使用 @WebFilter 注解和 ServletRegistrationBean
    对于基于 Servlet 的应用,可以通过 @WebFilter 注解来定义一个过滤器,并使用 ServletRegistrationBean 在 Spring Boot 应用程序中注册这个过滤器。但是,请注意,这种方法依赖于 Servlet 容器对 @WebFilter 的支持,而且它更适用于传统的 Servlet 应用程序而不是纯粹的 Spring Boot 应用程序。

  2. 实现 Filter 接口并注册为 Bean
    在 Spring Boot 应用程序中,更常见的做法是实现 javax.servlet.Filter 接口,然后直接在配置类中将其注册为一个 Bean。这种方法使得过滤器的注册更加灵活,并且可以更容易地集成到 Spring 的依赖注入体系中。

3.2 使用

第二种方法

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 {
//        servletRequest.getRequestDispatcher("/myFilter").forward(servletRequest,servletResponse);filterChain.doFilter(servletRequest, servletResponse); // 将请求传递给下一个过滤器或目标资源  }@Overridepublic void destroy() {System.out.println("filter被销毁中。。。");}
}

注册函数:

 @Beanpublic FilterRegistrationBean myFilter(){FilterRegistrationBean registrationBean = new FilterRegistrationBean();registrationBean.setFilter(new MyFilter());registrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));return registrationBean;}

4. servlet

4.1 简介

在Spring Boot中,虽然Spring Boot的自动配置和嵌入式服务器(如Tomcat, Jetty, 或Undertow)极大地简化了传统Servlet应用程序的部署和配置,但Spring Boot仍然支持Servlet API的使用。你可以直接在Spring Boot应用中注册和使用Servlet,这为你提供了灵活性来集成需要Servlet API的旧系统或库。

4.2 使用

  1. 创建servlet
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;public class MyServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("servlet正在创建");}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("正在服务!!!");System.out.println("走你!!!");servletRequest.getRequestDispatcher("/myServlet").forward(servletRequest,servletResponse);	// 跳转到/myServlet}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {System.out.println("servlet被销毁");}
}
  1. 注册
@Bean
public ServletRegistrationBean myServlet(){ServletRegistrationBean registrationBean = new ServletRegistrationBean( new MyServlet(),"/hello");return registrationBean;
}

5. 例子

登录的拦截器:在进行登录之前,判断是否有session,没有就跳转到登录界面
写一个拦截器

import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class LoginInterceptor implements HandlerInterceptor {// 没有session 就跳转@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 在请求处理之前进行调用(Controller方法调用之前)HttpSession session = request.getSession();if(session.getAttribute("user") == null){response.sendRedirect(request.getContextPath() + "/header");return false;}return true;}
}

注册:

@Configuration
@MapperScan("cn.tx.springboot.mapper")
public class TxMvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {List<String> excludePatterns = new ArrayList<String>();// 这几个请求不拦截excludePatterns.add("/css/**");excludePatterns.add("/images/**");excludePatterns.add("/toLogin");excludePatterns.add("/header");excludePatterns.add("/login");// 防止收不到jsexcludePatterns.add("/webjars/**");// 添加registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns(excludePatterns);}
}

6. 心得

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Arduino教程(1)
  • Ubuntu配置carla docker环境
  • 从“抠图”到“抠视频”,Meta上新AI工具SAM 2。
  • Android14音频进阶之使能内核debugfs:Adsp输出日志(七十九)
  • 【学习笔记】A2X通信的协议(三)- A2X PC5通信(一)
  • 使用visual studio2019创建dll导出自定义类
  • C语言实现浮点数或整数转成字符串
  • 【letcod-c++】128.最长连续序列
  • Visual Studio Code中跟创建运行项目有关的几个终端命令
  • 代码随想录算法训练营第七天(二)|15.三数之和 18.四数之和
  • day17-权限管理
  • IDEA左下角不显示本地修改的localChanges信息-git
  • Oracle认证1Z0-071线上考试注意事项
  • 关于keil程序无法进入main函数问题
  • 未来已来:全方位掌握【人工智能】的系统学习路线
  • php的引用
  • 0基础学习移动端适配
  • Java Agent 学习笔记
  • java 多线程基础, 我觉得还是有必要看看的
  • Python十分钟制作属于你自己的个性logo
  • sessionStorage和localStorage
  • SQLServer插入数据
  • Vultr 教程目录
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 产品三维模型在线预览
  • 高性能JavaScript阅读简记(三)
  • 欢迎参加第二届中国游戏开发者大会
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 前端路由实现-history
  • 使用SAX解析XML
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 我有几个粽子,和一个故事
  • 线上 python http server profile 实践
  • 一个JAVA程序员成长之路分享
  • Semaphore
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​人工智能书单(数学基础篇)
  • ​字​节​一​面​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (04)odoo视图操作
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (不用互三)AI绘画工具应该如何选择
  • (第30天)二叉树阶段总结
  • (回溯) LeetCode 131. 分割回文串
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)3D模板阴影原理
  • (转)IOS中获取各种文件的目录路径的方法
  • (轉貼) UML中文FAQ (OO) (UML)
  • .NET Core 项目指定SDK版本
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net经典笔试题
  • .NET中 MVC 工厂模式浅析