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

过滤器与拦截器知识

过滤器

在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 {

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

    @Override
    public 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("响应已发送");
    }

    @Override
    public 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 {

    @Override
    public 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方法可以根据需要进行重写
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在请求处理之后但在视图渲染之前执行的逻辑
    }

    @Override
    public 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 {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public 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属性来控制执行顺序。

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

相关推荐
小万编程28 分钟前
【2025最新计算机毕业设计】基于SSM的医院挂号住院系统(高质量源码,提供文档,免费部署到本地)【提供源码+答辩PPT+文档+项目部署】
java·spring boot·毕业设计·计算机毕业设计·项目源码·毕设源码·java毕业设计
白宇横流学长29 分钟前
基于Java的银行排号系统的设计与实现【源码+文档+部署讲解】
java·开发语言·数据库
123yhy传奇29 分钟前
【学习总结|DAY027】JAVA操作数据库
java·数据库·spring boot·学习·mybatis
code2roc32 分钟前
SpringBoot集成ECDH密钥交换
spring boot·ecdh·密钥交换·密钥协商
想要打 Acm 的小周同学呀34 分钟前
亚信科技Java后端外包一面
java·求职·java后端
lishiming03084 小时前
TestEngine with ID ‘junit-jupiter‘ failed to discover tests 解决方法
java·junit·intellij-idea
HEU_firejef4 小时前
设计模式——工厂模式
java·开发语言·设计模式
Kobebryant-Manba5 小时前
单元测试学习2.0+修改私有属性
java·单元测试·log4j
fajianchen5 小时前
应用架构模式
java·开发语言
Code成立5 小时前
《Java核心技术 卷II》流的创建
java·开发语言·流编程