【Springboot知识】Springboot基础-过滤器与拦截器开发

news/2025/1/3 7:12:39/

过滤器拦截器知识

过滤器

在Spring Boot中,过滤器(Filter)是一种服务器端组件,用于在请求到达控制器之前或响应发送给客户端之前进行拦截处理。以下是对Spring Boot过滤器的详细解析:

一、过滤器概述

过滤器是Servlet API的一部分,它基于Java Servlet规范中的Filter接口实现。在Spring Boot应用中,过滤器通常用于以下场景:

  • 记录请求和响应的日志。
  • 进行身份认证与授权。
  • 输入/输出数据验证。
  • 修改请求或响应。

二、过滤器的生命周期

过滤器的生命周期由Servlet容器管理,主要包括以下几个阶段:

  • 初始化:当Servlet容器启动时,会加载并初始化过滤器。这个过程中会调用过滤器的init方法。
  • 执行过滤逻辑:当请求到达时,Servlet容器会根据配置的URL模式将请求交给相应的过滤器处理。过滤器会执行doFilter方法中的逻辑,可以修改请求、响应或决定是否继续执行过滤器链。
  • 销毁:当Servlet容器关闭时,会销毁过滤器。这个过程中会调用过滤器的destroy方法。

三、过滤器的创建与注册

在Spring Boot中,创建和注册过滤器有以下几种方式:

  1. 实现Filter接口

    • 创建一个类实现javax.servlet.Filter接口,并重写init、doFilter和destroy方法。
    • 在doFilter方法中编写过滤逻辑。
  2. 使用@WebFilter注解

    • 过滤器类上使用@WebFilter注解指定URL模式和初始化参数。
    • 注意:需要在启动类上使用@ServletComponentScan注解以开启对@WebFilter的支持。
  3. 使用FilterRegistrationBean

    • 在配置类中创建一个FilterRegistrationBean的Bean,并设置过滤器的属性,如过滤器实例、URL模式、顺序等。
    • 这种方式提供了更灵活的配置选项。

四、过滤器的顺序

在Spring Boot中,可以通过@Order注解或实现Ordered接口来指定过滤器的执行顺序。如果没有指定顺序,则按照注册顺序执行。

五、过滤器的使用示例

以下是一个简单的过滤器示例,用于记录请求的URI和响应的发送情况:

java">import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;@Component
@Order(1) // 指定过滤器的执行顺序
public class SimpleLoggingFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 过滤器初始化逻辑(可选)}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;System.out.println("请求的URI: " + httpRequest.getRequestURI());// 继续执行下一个过滤器或请求处理chain.doFilter(request, response);System.out.println("响应已发送");}@Overridepublic void destroy() {// 过滤器销毁逻辑(可选)}
}

在上面的示例中,我们创建了一个名为SimpleLoggingFilter的过滤器,并使用@Component注解将其标记为Spring组件。过滤器会在请求到达时记录请求的URI,并在响应发送后打印一条消息。

六、注意事项

  • 过滤器只能对进入Servlet容器的请求进行处理,对于Spring MVC内部的请求转发或重定向等操作,过滤器不会再次拦截。
  • 如果需要在Spring MVC控制器之前和之后执行逻辑,并且需要访问Spring容器中的Bean,建议使用拦截器而不是过滤器

综上所述,Spring Boot中的过滤器是一种强大的工具,可以在请求处理过程中提供额外的控制和功能。通过合理配置和使用过滤器,可以有效地增强Web应用的安全性和性能。

拦截器

Spring Boot拦截器(Interceptor)是Spring框架提供的一种中间件,用于在请求到达控制器(Controller)之前或之后执行一些共享的逻辑。以下是对Spring Boot拦截器的详细解析:

一、拦截器的作用

拦截器的主要作用是在请求处理的不同阶段插入特定的逻辑,这些逻辑可以包括身份验证、权限检查、日志记录、性能监测等。与过滤器(Filter)相比,拦截器提供了更精细的控制,因为它可以访问控制器执行的上下文,包括执行的控制器本身和控制器方法的元数据。

二、拦截器的实现步骤

  1. 创建拦截器

    • 定义一个类实现HandlerInterceptor接口或继承HandlerInterceptorAdapter类。
    • 重写preHandlepostHandleafterCompletion三个方法。其中,preHandle方法在请求处理之前调用,postHandle方法在请求处理之后但在视图渲染之前调用,afterCompletion方法在整个请求处理完毕后调用。
  2. 注册拦截器

    • 实现WebMvcConfigurer接口并重写addInterceptors方法。
    • addInterceptors方法中,通过InterceptorRegistryaddInterceptor方法添加拦截器,并设置拦截的路径和排除的路径。

三、拦截器的具体实现

以下是一个简单的拦截器示例,用于检查用户的登录状态:

java">import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 获取HttpSession对象HttpSession session = request.getSession(false);// 检查用户是否已登录(这里以session中是否存在某个属性为例)if (session != null && session.getAttribute("session_userinfo") != null) {// 用户已登录,放行return true;}// 用户未登录,返回401状态码response.setStatus(401);return false;}// postHandle和afterCompletion方法可以根据需要进行重写@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 在请求处理之后但在视图渲染之前执行的逻辑}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 在整个请求处理完毕后执行的逻辑}
}

在配置类中注册拦截器

java">import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class MyConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**") // 拦截所有的URL.excludePathPatterns("/user/login", "/user/reg", "/image/**", "/**/*.js", "/**/*.css"); // 排除特定的URL}
}

四、拦截器的执行流程

  1. preHandle:在Controller方法调用之前执行。可以进行身份验证、权限检查等操作,并决定是否中断执行链,即是否将请求传递给控制器处理。如果返回值为false,则不会继续执行后续的拦截器和控制器方法;如果返回值为true,则继续执行。
  2. postHandle:在Controller方法调用之后,但在视图被渲染之前执行。可以对模型数据进行操作或对视图进行处理。
  3. afterCompletion:在整个请求结束后执行,即在视图渲染完毕后。这里可以进行资源清理等操作。

五、注意事项

  1. 拦截器只能对进入Spring MVC框架的请求进行处理,对于静态资源(如图片、CSS、JS等)的请求,默认情况下不会被拦截器拦截。
  2. 如果需要在Spring MVC控制器之前和之后执行逻辑,并且需要访问Spring容器中的Bean,建议使用拦截器而不是过滤器
  3. 可以通过配置多个拦截器来形成拦截器链,每个拦截器都会按照配置的顺序执行。

综上所述,Spring Boot拦截器是一种强大的工具,可以在请求处理的不同阶段插入特定的逻辑,以满足身份验证、权限检查、日志记录、性能监测等需求。通过合理配置和使用拦截器,可以有效地增强Web应用的安全性和性能。

过滤器拦截器的区别

过滤器拦截器都是用于在请求处理过程中执行特定逻辑的工具,但它们之间存在一些显著的区别。以下是对过滤器拦截器区别的详细分析:

一、出身与实现原理

  1. 过滤器(Filter)

    • 出身:过滤器来自于Servlet规范,是Servlet API的一部分。
    • 实现原理:过滤器是基于函数回调的。当请求到达服务器时,服务器会根据配置的过滤器链依次调用过滤器进行处理。每个过滤器都需要实现javax.servlet.Filter接口,并重写其中的doFilter方法。在doFilter方法中,可以执行特定的逻辑,并通过调用FilterChain对象的doFilter方法将请求传递给下一个过滤器或目标资源。
  2. 拦截器(Interceptor)

    • 出身:拦截器是Spring框架提供的一个组件,用于在Spring MVC应用中拦截请求。
    • 实现原理:拦截器是基于Java的反射机制(动态代理)实现的。当请求到达Spring MVC的DispatcherServlet时,DispatcherServlet会根据配置的拦截器链依次调用拦截器进行处理。每个拦截器都需要实现HandlerInterceptor接口,并重写其中的preHandlepostHandleafterCompletion方法。这些方法分别在请求处理的不同阶段被调用。

二、使用范围与项目类型

  1. 过滤器

    • 使用范围:过滤器只能用于Web项目中,且依赖于Servlet容器(如Tomcat)来运行。
    • 项目类型:由于过滤器是Servlet API的一部分,因此它只能用于基于Servlet的Web项目。
  2. 拦截器

    • 使用范围:拦截器不仅可以用于Web项目中,还可以用于Spring框架的其他项目类型中,如Application、Swing等。
    • 项目类型:拦截器是Spring框架的一部分,因此它可以在任何使用Spring框架的项目中使用。

三、触发时机与请求处理流程

  1. 过滤器

    • 触发时机:过滤器在请求进入Servlet容器后,但在进入Servlet之前进行预处理。请求结束后,过滤器也会在Servlet处理完请求后进行后处理。
    • 请求处理流程:请求 -> 过滤器链 -> Servlet -> 响应。
  2. 拦截器

    • 触发时机:拦截器在请求进入Servlet后,但在进入Controller之前进行预处理。Controller中渲染了对应的视图之后,拦截器也会进行后处理。
    • 请求处理流程:请求 -> Servlet -> 拦截器链 -> Controller -> 视图渲染 -> 响应。

四、功能与应用场景

  1. 过滤器

    • 功能:过滤器通常用于实现一些全局的、与业务逻辑无关的功能,如字符集编码设置、敏感词过滤、响应数据压缩等。
    • 应用场景:过滤器适用于需要对所有请求或响应进行统一处理的场景。
  2. 拦截器

    • 功能:拦截器更接近于业务系统,通常用于实现一些与业务逻辑相关的功能,如登录验证、权限检查、日志记录等。
    • 应用场景:拦截器适用于需要对特定请求或响应进行拦截并执行业务逻辑的场景。

五、其他区别

  1. 拦截请求的范围过滤器几乎可以对所有进入容器的请求起作用,而拦截器通常只会对Controller中的请求或访问static目录下的资源请求起作用。
  2. 注入Bean情况:由于加载顺序的原因,拦截器可以在Spring容器加载之前被加载,并且可以注入Spring容器中的Bean。而过滤器则无法直接注入Spring容器中的Bean。
  3. 控制执行顺序过滤器可以通过@Order注解或实现Ordered接口来控制执行顺序。拦截器则默认按照注册顺序执行,但也可以通过实现Ordered接口或设置Order属性来控制执行顺序。

综上所述,过滤器拦截器在出身、实现原理、使用范围、触发时机、功能与应用场景等方面都存在显著的区别。在实际应用中,应根据具体需求选择合适的工具来拦截和处理请求。


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

相关文章

医疗数仓数据仓库设计

医疗数仓数据仓库设计 数据仓库构建流程数据调研明确数据域构建业务总线矩阵明确统计指标交易主题医生主题用户主题评价主题 维度模型设计汇总模型设计 数据仓库构建流程 数据仓库分层规划 优秀可靠的数仓体系,需要良好的数据分层结构。合理的分层,能够…

Windows11 的开发

Windows 11的开发涉及多个方面,包括应用开发、系统集成、安全性增强等。以下是对Windows 11开发的具体内容、开发方法以及常用开发语言的详细解答: 一、Windows 11开发的具体内容 应用开发: 桌面应用:使用UWP(通用Win…

【AI大模型】深入GPT-2模型细节:揭秘其卓越性能的秘密

目录 🍔 GPT2的架构 🍔 GPT2模型的细节 2.1 模型过程 2.2 GPT2工作细节探究 🍔 小结 学习目标 掌握GPT2的架构掌握GPT2的训练任务和模型细节 🍔 GPT2的架构 从模型架构上看, GPT2并没有特别新颖的架构, 它和只带有解码器模块…

计算机视觉目标检测-2

文章目录 摘要abstract1.Fast R-CNN1.1 RoI pooling1.2 End-to -End model1.3 多任务损失-Multi-task loss1.4 R-CNN、SPPNet、Fast R-CNN效果比对 2.Faster R-CNN2.1 RPN原理2.2 效果对比2.3 Faster R-CNN总结 3.总结4.参考文献 摘要 本周学习了Fast R-CNN和Faster R-CNN算法…

Android 底部tab,使用recycleview实现

res/layout/activity_main.xml <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.co…

排序算法(系列)

希尔排序&#xff08;Shell Sort&#xff09;是一种插入排序的改进版本。它是基于插入排序的思想&#xff0c;通过将待排序的元素进行分组&#xff0c;然后对每组进行插入排序&#xff0c;逐步减少分组的大小&#xff0c;最终完成排序。希尔排序的核心思想是将序列分为多个子序…

基于c语言的union、字符串、格式化输入输出

结构体之共用体union 共用体也叫联合体&#xff0c;其关键词为union 与结构体不同的是&#xff0c;共用体所开辟的存储空间仅仅为其中最长类型变量的存储空间而不是全部变量的存储空间&#xff0c;由于同一内存单元在同一时间内只能存放其中一种的数据类型&#xff0c;因此在每…

评分模型在路网通勤习惯分析中的应用——提出问题(1)

1、问题的由来、目标和意义 最近一段时间和公司其它业务部门讨论时&#xff0c;发现一个有趣的交通路网问题&#xff0c;车辆从S点行驶到V点共用时40分钟&#xff0c;这段时间内路网中的卡口摄像头识别到了车辆通过的信息。如下图所示&#xff1a; 设计师需要通过这些有限的路…