SpringBoot拦截器怎么用?从入门到实战全攻略

 更新时间:2026年07月27日 15:22:51   作者:羊迪  
想掌握SpringBoot拦截器吗?本文手把手教你创建自定义拦截器,覆盖preHandle、postHandle和afterCompletion方法,实现登录验证、权限控制和日志记录,通过实战案例,轻松搞定拦截器注册与配置,提升应用安全与性能

简介:Spring Boot中的拦截器是在请求处理流程中执行预定义任务的一种方式,常用于权限检查、日志记录和性能监控等。

本教程介绍如何创建自定义拦截器,包括实现 HandlerInterceptor 接口或继承 AbstractHandlerMethodInterceptor 抽象类,并覆盖其中的三个主要方法: preHandle postHandle afterCompletion

通过注册拦截器到Spring Boot的配置类中,并配置需要拦截的URL模式,开发者可以根据业务需求定制拦截器,如访问权限控制和操作日志记录等功能。

1. Spring Boot拦截器概念与作用

1.1 拦截器定义

在Spring Boot框架中,拦截器(Interceptor)是用于在请求处理过程中,进行预处理和后处理的一种机制。

它类似于Servlet中的Filter,但拦截器可以更细粒度地控制请求和响应的处理过程。

1.2 拦截器作用

拦截器主要应用于以下几个方面:

  • - 权限验证 :对于需要权限控制的资源,拦截器可以验证用户的访问权限。
  • - 性能监控 :记录请求的处理时间,帮助开发者优化系统性能。
  • - 日志记录 :记录用户操作日志,便于进行审计和问题追踪。
  • - 请求预处理 :如压缩静态资源、添加响应头等。

拦截器的使用可以极大地增强应用的安全性、性能和可维护性,是构建企业级应用时不可或缺的一环。

在后续章节中,我们将详细探讨如何自定义拦截器、覆盖 HandlerInterceptor 接口中的方法以及在实际业务场景中的具体应用。

2. 自定义拦截器的步骤

2.1 创建拦截器类

2.1.1 实现HandlerInterceptor接口

在Spring Boot中,自定义拦截器主要通过实现 org.springframework.web.servlet.HandlerInterceptor 接口来完成。

该接口包含三个方法: preHandle postHandle afterCompletion 。下面是一个简单的拦截器实现示例。

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CustomInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // TODO: 在请求处理之前进行调用(Controller方法调用之前)
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        // TODO: 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // TODO: 在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要用于进行资源清理工作)
    }
}
2.1.2 定义拦截器逻辑

在实现 HandlerInterceptor 接口时,我们需要根据业务需求来定义 preHandle postHandle afterCompletion 方法的具体逻辑。

例如,我们可能需要在 preHandle 中检查用户是否登录,或者在 postHandle 中添加一些自定义数据到 ModelAndView 中,或者在 afterCompletion 中记录请求处理的时间等。

// 在preHandle中实现自定义业务逻辑
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    String requestURI = request.getRequestURI();
    if("/api/login".equals(requestURI)){
        // 对登录接口不需要拦截
        return true;
    }
    // 其他接口需要登录验证
    // 获取用户登录信息,验证用户是否登录
    User user = (User) request.getSession().getAttribute("USER");
    if(user == null){
        // 未登录
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        return false;
    }
    // 登录成功,返回true继续处理请求
    return true;
}

2.2 配置拦截器路径

2.2.1 编写配置类

实现拦截器接口并定义了拦截逻辑后,需要配置拦截器的路径,即告诉Spring Boot哪些请求路径需要通过该拦截器处理。

这需要创建一个配置类,实现 WebMvcConfigurer 接口,并重写 addInterceptors 方法。

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 WebConfig implements WebMvcConfigurer {

    @Autowired
    private CustomInterceptor customInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // TODO: 注册拦截器,配置拦截路径和排除路径
        registry.addInterceptor(customInterceptor)
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/login");
    }
}
2.2.2 设置拦截规则

addInterceptors 方法中,使用 InterceptorRegistry addInterceptor 方法注册拦截器,并使用 addPathPatterns excludePathPatterns 方法设置拦截规则。

例如,上例中所有 /api/** 路径下的请求都将被 CustomInterceptor 拦截,但登录接口 /api/login 被排除在外。

// 使用addPathPatterns来设置拦截的路径
.addPathPatterns("/api/**")

// 使用excludePathPatterns来设置不拦截的路径
.excludePathPatterns("/api/login")

这样,我们就完成了自定义拦截器的创建和配置。接下来的章节会详细解读 HandlerInterceptor 接口的方法,以及如何通过自定义拦截器实现具体的业务逻辑。

3.HandlerInterceptor接口方法覆盖

在这一章节,我们将会深入探讨 HandlerInterceptor 接口中的三个核心方法: preHandle postHandle afterCompletion

通过这三个方法,拦截器可以在请求处理的不同阶段介入,并执行相应的业务逻辑。

理解这三个方法的作用、参数以及返回值,对于自定义拦截器至关重要。接下来,我们将逐一分解这些方法,并通过实例演示它们的运用。

3.1preHandle方法详解

preHandle 方法是拦截器最先执行的方法,它在目标请求被处理之前被调用。

这个方法的返回值决定了请求是否继续向下传递,从而影响整个请求处理的流程。

3.1.1 方法参数和返回值说明

preHandle 方法定义如下:

boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
  • HttpServletRequest request :当前请求的请求对象。
  • HttpServletResponse response :当前请求的响应对象。
  • Object handler :被调用的处理器对象,可能是处理器方法或者是一个控制器。

该方法返回一个 boolean 类型的值。当返回 true 时,请求会继续向下传递;而当返回 false 时,请求将被拦截,后续的拦截器和处理器都不会执行,同时 postHandle afterCompletion 方法也不会被调用。

3.1.2 预处理逻辑的实现

实现 preHandle 方法时,开发者可以在这里执行各种预处理逻辑,如权限验证、请求验证等。

以下是一个简单的实现示例:

boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    // 从请求中获取用户身份信息
    String username = request.getParameter("username");
    // 假设我们需要用户名为admin才能访问
    if ("admin".equals(username)) {
        // 权限验证通过,返回true继续执行
        return true;
    } else {
        // 权限验证失败,返回false拦截请求
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
        return false;
    }
}

在实际应用中,我们可以根据业务需求编写复杂的逻辑来决定是否允许请求继续执行。此外, preHandle 方法非常适合用来初始化一些请求级别的数据或日志信息,这些数据或信息可以在后续的 postHandle afterCompletion 方法中使用。

3.2postHandle方法详解

一旦请求成功通过 preHandle 方法并被处理器方法处理后, postHandle 方法就会被调用。

该方法可以访问到模型和视图,适合用来修改最终要返回给客户端的响应数据。

3.2.1 方法参数和执行时机

postHandle 方法定义如下:

void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
  • HttpServletRequest request :当前请求的请求对象。
  • HttpServletResponse response :当前请求的响应对象。
  • Object handler :被调用的处理器对象,可能是处理器方法或者是一个控制器。
  • ModelAndView modelAndView :模型和视图对象,该参数可能为null。

postHandle 方法总是在控制器方法执行之后、渲染视图之前执行,因此它有机会修改 modelAndView 对象,进而影响最终的视图渲染。

3.2.2 后处理逻辑的实现

postHandle 方法非常适合用来进行数据的封装、统一的视图处理等操作。以下是一个简单的示例:

void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
    if (modelAndView != null && "user".equals(modelAndView.getViewName())) {
        // 假设我们对返回的视图名为"user"的视图做一些特殊处理
        modelAndView.addObject("someFlag", true);
    }
}

在这个例子中,我们检查了 modelAndView 的视图名,并在特定条件下向模型中添加了一个额外的属性。这样,在视图渲染的时候,就可以使用这个属性进行额外的逻辑判断或展示。

3.3afterCompletion方法详解

afterCompletion 方法是拦截器中最后被调用的方法。它在请求完全结束之后执行,此时响应已经发送到客户端,因此无法对响应进行修改。但 afterCompletion 方法可以进行一些请求结束后的清理工作。

3.3.1 方法参数和执行时机

afterCompletion 方法定义如下:

void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
  • HttpServletRequest request :当前请求的请求对象。
  • HttpServletResponse response :当前请求的响应对象。
  • Object handler :被调用的处理器对象,可能是处理器方法或者是一个控制器。
  • Exception ex :如果处理器执行过程中抛出异常,该参数将包含异常信息;否则,该参数为null。

这个方法的执行时机是在整个请求处理链都执行完毕之后,无论是否有异常发生。

3.3.2 完成后的处理逻辑

afterCompletion 方法适合用来执行一些资源的清理工作,比如关闭数据库连接、释放文件资源等。

void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    if (ex != null) {
        // 如果请求处理过程中有异常发生,可以在这里进行异常记录等操作
        logger.error("Request processing failed", ex);
    }
    // 清理请求相关的资源,例如释放数据库连接等
    // cleanupResource(request);
}

在这个示例中,我们检查了是否存在异常,并对异常进行了记录。同时,我们预留了一个注释,说明这里可以进行资源清理的相关操作。

通过上述对 HandlerInterceptor 接口中三个核心方法的介绍和示例,开发者应该对如何使用这些方法有了更清晰的认识。在下一章中,我们将具体探讨如何实现一个自定义的拦截器,并展示实际应用的示例代码。

4. 自定义拦截器实现示例

4.1 简单登录验证拦截器

在Web应用中,登录验证是常见需求。拦截器可以用来拦截对受保护资源的请求,检查用户是否已经登录。实现该功能,需要创建一个拦截器,检查用户会话中的登录信息。

4.1.1 验证用户登录状态

通常,用户的登录状态会通过一个session或者token来维持。以下示例中,我们使用session来存储用户的登录信息。

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 从session中获取用户信息
        Object user = request.getSession().getAttribute("user");
        if (user == null) {
            // 未登录,重定向到登录页面
            response.sendRedirect("/login");
            return false;
        }
        return true;
    }

    @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 {
        // 请求完全处理后,可以进行一些清理工作
    }
}

preHandle 方法中,我们通过检查session中的 user 对象是否存在来判断用户是否已经登录。如果用户未登录(即 user null ),则将请求重定向到登录页面。

4.1.2 重定向到登录页面

如果用户未登录,我们必须为用户跳转到登录页面,以便用户进行身份验证。在 preHandle 方法中添加的重定向代码如下:

response.sendRedirect("/login");

此处的 /login 是指用户登录页面的访问路径。如果用户的浏览器未设置任何拦截,用户将能看到登录页面,并输入凭证进行登录。

4.2 权限控制拦截器

权限控制是另一个常见的拦截器应用场景。通过拦截器,我们可以检查用户是否有权访问某些资源或者执行某些操作。

4.2.1 检查用户权限

用户权限通常是以角色的形式存储在用户的会话信息中。

以下是权限检查拦截器的一个简单实现示例:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PermissionInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 假设用户角色存储在session中,并且名为"userRole"
        String userRole = (String) request.getSession().getAttribute("userRole");
        // 假设需要角色"admin"才能访问某个特定资源或方法
        if (!"admin".equals(userRole)) {
            // 用户没有权限访问,返回403状态码
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "You don't have permission to access this resource.");
            return false;
        }
        return true;
    }

    @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 {
        // 此处不执行任何操作
    }
}

preHandle 方法中,我们检查用户的角色是否符合要求。如果不符合,则返回403状态码,表示用户没有权限访问该资源。

4.2.2 根据权限执行拦截逻辑

根据用户的角色或权限,我们可以执行不同的拦截逻辑。例如,对于需要 admin 角色的操作,我们可以如下执行权限控制:

if (!"admin".equals(userRole)) {
    // 执行权限控制逻辑
}

如果用户角色不是 admin ,则无法访问该资源或执行相关操作。

4.3 日志记录拦截器

日志记录是一个普遍的需求,它可以用来记录请求信息、用户行为,甚至对请求的处理性能进行分析。这有助于在发生问题时进行问题追踪和系统优化。

4.3.1 记录请求相关信息

preHandle 方法中,我们可以记录请求的开始时间,而在 postHandle 方法中记录请求结束时间,并计算处理时间。

以下是日志记录拦截器的实现示例:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class LogInterceptor implements HandlerInterceptor {

    private static final Logger logger = LoggerFactory.getLogger(LogInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 记录请求开始时间
        long startTime = System.currentTimeMillis();
        request.setAttribute("startTime", startTime);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 记录请求结束时间并计算处理时间
        long startTime = (Long) request.getAttribute("startTime");
        long endTime = System.currentTimeMillis();
        logger.info("Request URL: {} | Time Taken: {}ms", request.getRequestURL(), (endTime - startTime));
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 此处可以进行一些清理工作
    }
}

在该拦截器中,我们在 preHandle 方法中记录请求开始的时间戳,并将其存储在请求属性中。然后,在 postHandle 方法中,我们从请求属性中获取开始时间戳,并计算请求处理的时间。

4.3.2 分析请求处理性能

通过记录请求的开始和结束时间,我们可以进行请求处理性能的分析。

例如,我们可以计算处理请求所需的总时间,并据此分析可能的性能瓶颈。

long endTime = System.currentTimeMillis();
logger.info("Request URL: {} | Time Taken: {}ms", request.getRequestURL(), (endTime - startTime));

上段代码记录了请求URL和处理时间,并将其写入日志中。这样,我们就能了解每个请求的处理时间,并对性能进行分析。

通过上述拦截器实现示例,我们可以看到,拦截器在实际开发中是多么灵活且功能强大。它们不仅可以用于登录验证和权限检查,还可以用于请求日志的记录,为开发者提供了一种有效的方法来增强应用的安全性和调试能力。

在实际开发中,结合具体需求,我们还可以扩展更多功能,以实现更加丰富和高效的应用场景。

5. 拦截器注册与配置方法

在这一章节中,我们将深入探讨如何在Spring Boot应用中注册和配置拦截器。这一过程不仅包括拦截器类的创建,还包括将拦截器与Spring MVC框架绑定的步骤。这将确保我们的自定义逻辑能够按预期工作,在适当的时机介入请求处理流程。

5.1 拦截器注册步骤

5.1.1 创建拦截器注册类

拦截器需要注册到Spring MVC的配置中,以便其能够被框架识别和使用。这通常是通过实现 WebMvcConfigurer 接口,并在其配置类中重写 addInterceptors 方法来完成的。

下面将展示一个拦截器注册类的示例,该类负责将我们自定义的拦截器添加到Spring MVC的处理链中。

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 WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private CustomInterceptor customInterceptor;  // 假设我们已经创建了一个名为CustomInterceptor的拦截器实例

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册自定义拦截器
        registry.addInterceptor(customInterceptor)
                .addPathPatterns("/**")  // 指定拦截器拦截的路径模式
                .excludePathPatterns("/login", "/css/**", "/js/**");  // 指定排除拦截的路径模式
    }
}

在上述代码中, WebMvcConfig 类实现了 WebMvcConfigurer 接口。在 addInterceptors 方法内部,通过调用 registry.addInterceptor 方法注册了拦截器,并通过 addPathPatterns 方法定义了拦截器将拦截的请求路径, excludePathPatterns 方法定义了不被拦截的路径。

需要注意的是,路径模式可以使用Spring MVC提供的标准Ant风格路径模式进行匹配。

5.1.2 使用WebMvcConfigurer接口

WebMvcConfigurer 接口是一个便捷的配置方式,允许开发者在Spring Boot应用中对Spring MVC进行定制化配置,而无需直接操作 DispatcherServlet 的配置。

通过实现此接口,开发者可以在配置类中重写多种方法以添加拦截器、设置视图解析器等。

逻辑分析:

  • 通过 @Configuration 注解,标记 WebMvcConfig 类为一个配置类。
  • @Autowired 注解用于注入自定义的拦截器实例 CustomInterceptor
  • addInterceptors 方法是实现 WebMvcConfigurer 接口时需要重写的核心方法,它接收一个 InterceptorRegistry 参数。
  • registry.addInterceptor 方法用于添加拦截器到注册器,而 addPathPatterns excludePathPatterns 则是用来指定拦截器适用的URL模式。

5.2 配置类中的拦截器设置

5.2.1 重写addInterceptors方法

在Spring Boot中,自定义拦截器的注册和配置主要是通过 addInterceptors 方法来完成的。这个方法是 WebMvcConfigurer 接口的一部分,允许开发者添加多个拦截器到Spring MVC的拦截器链中。

下面的示例展示了如何在配置类中使用该方法。

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomInterceptor())
                .addPathPatterns("/**")  // 指定拦截所有请求
                .excludePathPatterns("/public/**");  // 指定排除公共资源目录下的请求
    }
}

在这个配置中, CustomInterceptor 是我们自定义的拦截器。通过调用 addPathPatterns ,我们指定了这个拦截器将拦截所有符合 /** 模式的请求。 excludePathPatterns 用于排除掉不需要拦截的路径,例如 /public/** ,这通常用于公共资源如静态文件。

5.2.2 指定拦截路径和排除路径

当实现拦截器配置时,重要的是能够精确控制哪些请求应当被拦截,哪些可以被排除。

这可以通过 addPathPatterns excludePathPatterns 方法实现。这两个方法均接受Ant风格的路径模式字符串,以灵活地匹配URL路径。

参数说明:

  • addPathPatterns 方法定义了哪些请求路径会被拦截器处理。多个路径模式可以通过多次调用该方法来添加。
  • excludePathPatterns 方法定义了哪些请求路径应当从拦截器处理中排除。这对于包含静态资源的路径或不需要进行任何拦截操作的路径特别有用。

示例:

// 定义拦截所有非公共资源请求的拦截器配置
.addPathPatterns("/**")
.excludePathPatterns("/public/**", "/error");

在该示例中,所有路径都会被 CustomInterceptor 拦截器处理,除了 /public/** /error 路径。

这意味着拦截器会忽略对静态文件的请求以及Spring Boot默认的错误处理路径。

5.3 拦截器的优先级配置

5.3.1 通过order方法设置优先级

在某些情况下,一个应用可能会有多个拦截器,这些拦截器之间可能会有执行顺序的要求。通过为每个拦截器设置一个顺序值,可以精确控制拦截器的执行优先级。

这在 WebMvcConfigurer 接口的 addInterceptors 方法中通过 order 方法来实现。

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new CustomInterceptor())
            .addPathPatterns("/**")
            .excludePathPatterns("/public/**")
            .order(Ordered.HIGHEST_PRECEDENCE);  // 设置拦截器优先级为最高

    registry.addInterceptor(new AnotherInterceptor())
            .addPathPatterns("/**")
            .excludePathPatterns("/public/**")
            .order(Ordered.LOWEST_PRECEDENCE);  // 设置拦截器优先级为最低
}

逻辑分析:

  • order 方法允许为拦截器指定一个整数优先级,整数越小,优先级越高。
  • Ordered.HIGHEST_PRECEDENCE Ordered.LOWEST_PRECEDENCE Ordered 接口提供的两个特殊值,分别代表最高和最低优先级。
  • 在执行时,Spring MVC会按照优先级顺序执行拦截器,优先级高的拦截器先执行。

5.3.2 多个拦截器的执行顺序

在实际应用中,可能会注册多个拦截器。在这些拦截器中,执行顺序取决于它们的优先级。

如果拦截器具有相同的优先级,则它们将按照它们被注册的顺序执行。理解拦截器的执行顺序对于实现复杂的请求处理逻辑至关重要。

执行顺序规则:

  1. 拦截器按照注册时的顺序添加到拦截器链中。
  2. 在拦截器链中,具有更高优先级(即更小的 order 值)的拦截器会先执行。
  3. 如果两个拦截器具有相同的优先级,那么将按照它们被添加到链中的顺序执行。

示例:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new FirstInterceptor())
            .addPathPatterns("/**")
            .order(Ordered.HIGHEST_PRECEDENCE + 1);

    registry.addInterceptor(new SecondInterceptor())
            .addPathPatterns("/**")
            .order(Ordered.HIGHEST_PRECEDENCE);

    registry.addInterceptor(new ThirdInterceptor())
            .addPathPatterns("/**")
            .order(Ordered.HIGHEST_PRECEDENCE - 1);
}

在该示例中, SecondInterceptor 将首先执行,因为它的 order 值最低。 FirstInterceptor ThirdInterceptor 将分别按照它们在注册代码中出现的顺序执行。这样就确保了拦截器按照预期的优先级和顺序进行执行。

通过本章节的介绍,我们了解了拦截器的注册和配置方法。接下来的章节将继续深入探讨在实际业务场景中如何定制和应用拦截器,以及如何处理各种业务逻辑。

6. 实际业务中拦截器的定制应用

在现代的业务系统开发中,拦截器不仅是一个重要的技术组件,更是保证系统安全和性能的关键。本章将探讨在具体业务场景中如何定制和优化Spring Boot拦截器的应用。

6.1 电商系统的登录状态维护

在电商系统中,用户登录状态的维护是至关重要的。拦截器可以有效地进行用户身份校验以及处理无权限访问的情况。

6.1.1 用户身份校验逻辑

public class UserAuthenticationInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        User user = (User) session.getAttribute("currentUser");
        if (user == null || user.getId() == null) {
            response.sendRedirect("/login");
            return false;
        }
        return true;
    }
}

以上代码片段展示了如何在 preHandle 方法中检查用户是否已经登录。如果用户未登录,将重定向到登录页面。

6.1.2 无权限访问时的处理

当用户试图访问需要特定权限的资源时,拦截器可以阻止这一行为,并给出相应的提示。

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    if (ex != null) {
        // 异常处理逻辑
    }
    // 在此可以记录用户访问日志或统计信息
}

afterCompletion 方法中,可以根据异常信息进行错误处理或者记录用户的访问日志。

6.2 社交平台的内容审核拦截器

内容审核是社交平台的责任之一,拦截器可以在内容发布前进行自动过滤。

6.2.1 实时监控用户行为

public class ContentReviewInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String content = request.getParameter("content");
        if (content != null && content.length() > 1000) {
            // 认为内容过长,需要进行审核
            // 这里可以调用审核服务
            // 示例:reviewService.reviewContent(content);
            return false; // 拦截请求
        }
        return true;
    }
}

在上述代码中,拦截器检查请求参数中的内容长度,超过一定长度则进行审核。

6.2.2 自动过滤不当内容

// 假设有一个审核服务
@Service
public class ReviewService {
    public ContentReviewResult reviewContent(String content) {
        // 调用内容审核的API或算法
        // 返回审核结果
        return new ContentReviewResult(); // 假设这是审核结果的封装
    }
}

实际中可以集成文本分析服务对内容进行过滤。

6.3 在线教育平台的防刷课件拦截器

防止用户通过自动化手段恶意下载课件是在线教育平台面临的问题。

6.3.1 防止恶意用户下载课件

public class CoursewareDownloadInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String userId = request.getParameter("userId");
        // 检查用户是否在短时间内频繁下载
        if (downloadRateLimitService.isOverLimit(userId)) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "下载频率过高");
            return false;
        }
        return true;
    }
}

拦截器可以利用限流服务来判断用户是否在合理的时间内请求下载课件。

6.3.2 课件访问频率控制

@Service
public class DownloadRateLimitService {
    private Map<String, AtomicLong> downloadCounts = new ConcurrentHashMap<>();

    public boolean isOverLimit(String userId) {
        AtomicLong count = downloadCounts.computeIfAbsent(userId, k -> new AtomicLong(0));
        long currentCount = count.incrementAndGet();
        // 设置允许的下载次数和时间窗口
        if (currentCount > MAX_DOWNLOADS) {
            count.set(0); // 重置计数
            return true;
        }
        return false;
    }
}

课件防刷逻辑可以通过维护用户下载计数来实现。

6.4 企业内部系统的审计日志记录

企业内部系统往往需要记录审计日志,以跟踪对敏感数据的操作。

6.4.1 对敏感操作进行日志记录

public class AuditLoggingInterceptor extends HandlerInterceptorAdapter {
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        if (request.getRequestURI().contains("/sensitive-data")) {
            // 记录敏感操作的审计日志
            // 示例:auditService.logAccess(request, response);
        }
    }
}

postHandle 方法中,可以对请求进行过滤,记录下访问敏感数据的操作。

6.4.2 日志审计与分析功能

@Service
public class AuditService {
    public void logAccess(HttpServletRequest request, HttpServletResponse response) {
        // 日志信息收集
        // 日志存储和分析
    }
}

审计服务可以将日志信息存储在数据库或专门的日志服务中,便于后续的查询和分析。

通过上述几个实际的业务案例,可以了解到在不同的业务场景中,如何根据需要定制拦截器来提升系统的性能和安全性。拦截器的应用是广泛且灵活的,合理地应用拦截器能够帮助企业构建更为健壮的应用程序。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java 容器的快速失败(fast-fail)机制

    java 容器的快速失败(fast-fail)机制

    Java容器的快速失败机制是一种在迭代过程中检测并处理集合并发修改的特性,该机制适用于ArrayList、HashMap等集合类,本文就来介绍一下java 容器的快速失败(fast-fail)机制,感兴趣的可以了解一下
    2024-11-11
  • 详解ConcurrentHashMap如何保证线程安全及底层实现原理

    详解ConcurrentHashMap如何保证线程安全及底层实现原理

    这篇文章主要为大家介绍了ConcurrentHashMap如何保证线程安全及底层实现原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Spring中Bean初始化和销毁的方式总结

    Spring中Bean初始化和销毁的方式总结

    这篇文章主要为大家整理了Spring中Bean初始化和销毁的多种方式,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下
    2023-04-04
  • java安全编码指南之:Mutability可变性详解

    java安全编码指南之:Mutability可变性详解

    这篇文章主要介绍了java安全编码指南之:Mutability可变性详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Spring中容器创建的四种方式示例

    Spring中容器创建的四种方式示例

    这篇文章主要介绍了Spring中容器创建的四种方式示例,Spring容器是Spring框架的核心部分,它负责管理和组织应用程序中的对象,它提供了一种轻量级的、非侵入式的方式来实现对象的创建、依赖注入和生命周期管理,需要的朋友可以参考下
    2023-10-10
  • Springmvc restful配置遇到的小坑

    Springmvc restful配置遇到的小坑

    本文是小编给大家带了的Springmvc restful配置遇到的小小坑,小编给大家带来了问题原因及解决办法,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
    2016-07-07
  • springboot集成junit编写单元测试实战

    springboot集成junit编写单元测试实战

    在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,本文主要介绍了springboot集成junit编写单元测试实战,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • java版本管理工具jenv的实现

    java版本管理工具jenv的实现

    jenv是一个专注于管理多个Java版本的工具,适合需要在不同项目或环境中切换Java版本的开发者,支持插件扩展,并且可以与其他开发工具无缝集成,感兴趣的可以了解一下
    2025-07-07
  • 在IntelliJ IDEA中创建和运行java/scala/spark程序的方法

    在IntelliJ IDEA中创建和运行java/scala/spark程序的方法

    这篇文章主要介绍了在IntelliJ IDEA中创建和运行java/scala/spark程序的教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 基于SpringBoot开机启动与@Order注解

    基于SpringBoot开机启动与@Order注解

    这篇文章主要介绍了SpringBoot开机启动与@Order注解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论