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

Spring Boot 中的拦截器 Interceptors

 ​

博客主页:     南来_北往

系列专栏:Spring Boot实战


前言

Spring Boot中的拦截器(Interceptor)是一种用于拦截和处理HTTP请求的机制,它基于Spring MVC框架中的HandlerInterceptor接口实现。拦截器允许在请求到达控制器(Controller)之前或之后执行一些共享的逻辑。

自定义拦截器案例

下面是一个自定义拦截器的示例,用于记录请求的开始时间和结束时间:

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

public class LogInterceptor implements HandlerInterceptor {
    @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 endTime = System.currentTimeMillis();
        long startTime = (Long) request.getAttribute("startTime");
        long executionTime = endTime - startTime;
        System.out.println("Request URL: " + request.getRequestURL());
        System.out.println("Execution time: " + executionTime + "ms");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 可选操作,在请求完成后执行一些清理工作
    }
}

接下来,我们需要将这个拦截器注册到Spring MVC的拦截器链中。可以通过实现WebMvcConfigurer接口并重写addInterceptors方法来实现:

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 {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor())
                .addPathPatterns("/api/**") // 指定拦截路径模式
                .excludePathPatterns("/api/login"); // 排除登录路径
    }
}

在上面的代码中,我们创建了一个名为LogInterceptor的拦截器类,并在WebConfig类中将其注册到拦截器链中。通过addPathPatterns方法指定了需要拦截的URL路径模式,而excludePathPatterns方法则排除了不需要拦截的路径。在这个例子中,我们将拦截所有以"/api/"开头的请求,但排除了"/api/login"路径。

当有请求匹配到指定的路径模式时,LogInterceptor中的preHandle方法会在请求到达控制器之前被调用,postHandle方法会在请求处理完成后被调用。在这些方法中,我们可以添加自定义的逻辑来记录请求的开始时间和结束时间,并计算请求的处理时间。

注册拦截器案例

 下面是一个注册拦截器的示例,用于检查用户是否已登录:

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 检查用户是否已登录
        if (request.getSession().getAttribute("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 {
        // 可选操作,在请求完成后执行一些清理工作
    }
}

接下来,我们需要将这个拦截器注册到Spring MVC的拦截器链中。可以通过实现WebMvcConfigurer接口并重写addInterceptors方法来实现:

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 {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/api/**") // 指定拦截路径模式
                .excludePathPatterns("/api/login", "/api/register"); // 排除登录和注册路径
    }
}

在上面的代码中,我们创建了一个名为LoginInterceptor的拦截器类,并在WebConfig类中将其注册到拦截器链中。通过addPathPatterns方法指定了需要拦截的URL路径模式,而excludePathPatterns方法则排除了不需要拦截的路径。在这个例子中,我们将拦截所有以"/api/"开头的请求,但排除了"/api/login"和"/api/register"路径。

当有请求匹配到指定的路径模式时,LoginInterceptor中的preHandle方法会在请求到达控制器之前被调用。在这个方法中,我们检查用户的登录状态,如果用户未登录,则重定向到登录页面并阻止请求继续执行后续处理。如果用户已登录,则允许请求继续执行后续处理。

总结

总结来说,Spring Boot中的拦截器是一种强大的工具,可以在请求处理的不同阶段执行自定义逻辑。通过实现HandlerInterceptor接口并注册到拦截器链中,可以轻松地添加日志记录、权限检查、性能监控等功能。


http://www.kler.cn/a/317088.html

相关文章:

  • 软件工程笔记二—— 软件生存期模型
  • 【教程】Ubuntu设置alacritty为默认终端
  • CSP/信奥赛C++语法基础刷题训练(8):洛谷P5718:找最小值
  • Nuxt.js 应用中的 schema:beforeWrite 事件钩子详解
  • EXCEL延迟退休公式
  • 使用API有效率地管理Dynadot域名,编辑账户中whois联系人信息
  • 【已解决】用JAVA代码实现递归算法-从自然数中取3个数进行组合之递归算法-用递归算法找出 n(n>=3) 个自然数中取 3 个数的组合。
  • 在云渲染中3D工程文件安全性怎么样?
  • 【HarmonyOS】深入理解@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化
  • Unity-Screen屏幕相关
  • 【设计模式】万字详解:深入掌握五大基础行为模式
  • 鸿蒙 OS 开发零基础快速入门教程
  • ER论文阅读-Incomplete Multimodality-Diffused Emotion Recognition
  • 【LLM学习之路】9月22日 第九天 自然语言处理
  • 计算一个矩阵的逆矩阵的方法
  • 2024ICPC网络赛第一场C. Permutation Counting 4(线性代数)
  • nginx的反向代理和负载均衡
  • 16.3 k8s容器cpu内存告警指标与资源request和limit
  • 【数据结构-栈】力扣682. 棒球比赛
  • 0-1开发自己的obsidian plugin DAY 1
  • 鸿蒙操作系统(HarmonyOS)生态与机遇
  • YOLOv10改进,YOLOv10替换主干网络为PP-HGNetV1(百度飞桨视觉团队自研,全网首发,助力涨点)
  • watch和computed的使用及区别
  • Correcting Chinese Spelling Errors with Phonetic Pre-training(ACL2021)
  • Python Web 面试题
  • Spring Boot自定义配置项