Spring Boot 中的拦截器 Interceptors

news/2024/10/4 2:39:25 标签: spring boot, java, 前端

 ​

博客主页:     南来_北往

系列专栏:Spring Boot实战


前言

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

自定义拦截器案例

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

java">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方法来实现:

java">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方法会在请求处理完成后被调用。在这些方法中,我们可以添加自定义的逻辑来记录请求的开始时间和结束时间,并计算请求的处理时间。

注册拦截器案例

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

java">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方法来实现:

java">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.niftyadmin.cn/n/5689316.html

相关文章

链表面试编程题

1. 删除链表中等于给定值 val 的所有节点。 203. 移除链表元素 - 力扣(LeetCode) 2. 反转一个单链表。206. 反转链表 - 力扣(LeetCode) 3. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间…

Spring 的 IOC 和 AOP 是什么,有哪些优点?解密 Spring两大核心概念:IOC与AOP的魅力所在

在现代Java开发中,Spring框架几乎是不可或缺的存在。它不仅简化了开发过程,还提高了软件的灵活性和可维护性。今天,我们要深入探讨Spring中的两个核心概念:IOC(控制反转)和AOP(面向切面编程&…

C#的面向对象

1)对象 算法数据结构 2)对象的行为已方法的形式定义的,属性以成员变量的形式定义的 面向对象程序设计的特点 1)封装性 2)继承性 3)多态性 知识点: 封装性面向对象的核心思想,将…

k8s 部署 grafana

创建namespace grafana-namespace.yaml apiVersion: v1 kind: Namespace metadata:name: ns-grafana拉取镜像 swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/rancher/mirrored-grafana-grafana:10.3.3grafana的Deployment grafana-deployment.yaml apiVersion: app…

命令按钮QCommandLinkButton

主要作用:用来点击后可以自动打开系统的网页浏览器,跳转到指定的网页 常用方法 文本 //获取和设置文本 QString text() const void setText(const QString &text)描述信息 //获取和设置描述文本 QString description() const void setDescripti…

CSS多列

CSS多列 前言 有的时候希望文本能按照多列效果显示,如: 这时候就要把文本显示效果改成多列显示,标题独占一行 CSS文本多列使用 ① column-count 指定文本分为几列,如: column-count: 3;② column-gap 指定列之…

Python | Leetcode Python题解之第450题删除二叉搜索树中的节点

题目: 题解: class Solution:def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:cur, curParent root, Nonewhile cur and cur.val ! key:curParent curcur cur.left if cur.val > key else cur.rightif cur i…

负载均衡--相关面试题(六)

在负载均衡的面试中,可能会遇到一系列涉及概念、原理、实践应用以及技术细节的问题。以下是一些常见的负载均衡面试题及其详细解答: 一、什么是负载均衡? 回答:负载均衡是一种将网络请求或数据传输工作分配给多个服务器或网络资源…