SpringBoot 拦截器

SpringBoot 拦截器

在Spring Boot中,拦截器(Interceptor)是一个强大的工具,它允许你在请求处理之前、之后以及渲染视图之后执行代码。拦截器可以用于执行各种任务,如日志记录、身份验证、授权、数据转换等。

Spring Boot中的拦截器通常实现HandlerInterceptor接口,该接口定义了三个方法:

  1. preHandle

    在请求处理之前调用。你可以在这里执行诸如验证、日志记录等操作。如果此方法返回false,则请求将不会继续处理。

  2. postHandle

    在请求处理之后但在视图渲染之前调用。你可以在这里对模型数据进行后处理。

  3. afterCompletion

    在整个请求处理完成后调用,即视图渲染之后。你可以在这里执行清理操作。

拦截器流程图:


要在Spring Boot中使用拦截器,你需要执行以下步骤:

创建拦截器类:

这里以实现登录拦截器为例:

java 复制代码
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

@Component
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在请求处理之前执行的代码(Controller方法调用之前)
        System.out.println("Pre-handle method is called");
        HttpSession session = request.getSession();
        Object loginUser = session.getAttribute("loginUser");
        if(loginUser == null){
            response.sendRedirect("/user/login");
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在请求处理之后执行的代码(Controller方法调用之后)
        System.out.println("Post-handle method is called");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在请求处理完成后执行的代码(即视图渲染之后)
        System.out.println("After-completion method is called");
    }
}

注册拦截器:

java 复制代码
import cn.qvtu.web.interceptor.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class LoginConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration registration = registry.addInterceptor(loginInterceptor);
        registration.addPathPatterns("/user/**"); // 拦截/user下的所有路径
        registration.excludePathPatterns(  // 排除特定路径
                "/user/login",
                "/user/register"
        );
    }
}

在上面的配置中,addPathPatterns方法定义了哪些URL路径应该被拦截,而excludePathPatterns方法则定义了哪些路径应该被排除。

拦截器是Spring MVC框架中一个非常强大的特性,通过它你可以对请求处理流程进行细粒度的控制。

相关推荐
小蒜学长10 小时前
基于Spring Boot+Vue3的在线游戏技术指导师匹配系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·在线游戏技术指导
weixin_BYSJ198711 小时前
【计算机毕设】房屋租赁系统02647
java·vue.js·spring boot·python·django·课程设计
VX_bysjlw98511 小时前
基于协同过滤的美食推荐系统的设计与实现32221-计算机毕设原创(免费领源码+带部署教程)
java·spring boot·redis·mysql·tomcat·maven·mybatis
专业程序开发源12 小时前
springboot校企合作双选会一站式预约与面试系统16010-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·面试·php·课程设计
code_slave(码畜)13 小时前
微服务架构落地:读写分离架构 —— 主从延迟引发的“刚开单查不到”灾难与破局
spring boot·分布式·spring cloud·微服务·云原生·架构·读写分离
凤山老林14 小时前
构建多通道通知中心:模板化设计、异步削峰与可靠重试实践
spring boot·异步削峰·模板设计
vipxieliang15 小时前
ValidX 验证器缓存机制:如何提升验证性能
java·spring boot
Thomas.Sir17 小时前
第1课:SpringBoot 4.x 快速上手:新特性、环境准备与第一个HelloWorld程序
java·spring boot
程序员小孔.17 小时前
基于 Spring Cloud + Vue 的 JEEWMS 开源仓储管理平台设计与实现
前端·javascript·vue.js·spring boot·spring cloud·开源
RuoyiOffice17 小时前
SpringBoot+Vue3 业财协同架构:预算、费用分摊、发票、往来与凭证怎样避免五套数字
spring boot·vue3·财务管理·spring boot 3·预算管理·ruoyi office·业财协同