SpringBoot配置类与拦截器笔记

一、配置类(Configuration)

1. 配置类基本概念

配置类是SpringBoot中用于替代XML配置文件的Java类,使用@Configuration注解标识,通过@Bean注解将对象注册到Spring容器中。

2. BeanConfiguration配置类示例

package cn.wolfcode.config;

import cn.wolfcode.domain.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanConfiguration {

    @Value("${user.name123}")
    private String name;

    @Value("${user.password}")
    private String password;

    @Bean
    public User user1() {
        return new User(name, password);
    }

    @Bean
    public User user2() {
        return new User(name + "2", password);
    }
}

3. 核心注解说明

@Configuration

  • 作用:标识当前类为配置类
  • 说明:相当于Spring XML配置文件中的<beans>标签
  • 位置:类级别

@Bean

  • 作用:将方法的返回值注册为Spring容器中的Bean
  • 说明:相当于XML中的<bean>标签
  • 位置:方法级别
  • 特点
    • 方法名默认作为Bean的名称
    • 方法返回值作为Bean的类型
    • 方法参数自动从容器中注入

@Value

  • 作用:从配置文件中读取属性值并注入
  • 说明:支持SpEL表达式
  • 语法${属性名}
  • 位置:字段或方法参数

4. 配置文件示例

application.yml中配置属性:

user:
  name123: admin
  password: 123456

5. 配置类使用场景

  • 第三方库的Bean配置
  • 复杂对象的初始化
  • 需要特定逻辑的Bean创建
  • 替代XML配置文件

二、Web配置类(WebConfiguration)

1. WebConfiguration配置类示例

package cn.wolfcode.config;

import cn.wolfcode.intercept.TimeIntercept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
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 WebConfiguration implements WebMvcConfigurer {

    @Autowired
    private TimeIntercept timeIntercept;

    @Bean
    public TimeIntercept timeIntercept() {
        return new TimeIntercept();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(timeIntercept).addPathPatterns("/**");
    }
}

2. WebMvcConfigurer接口

  • 作用:提供Spring MVC的配置回调接口
  • 常用方法
    • addInterceptors():添加拦截器
    • addViewControllers():添加视图控制器
    • addResourceHandlers():添加静态资源处理器
    • configureMessageConverters():配置消息转换器

3. 拦截器注册

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(timeIntercept)
            .addPathPatterns("/**")  // 拦截所有路径
            .excludePathPatterns("/static/**");  // 排除静态资源
}

常用方法:

  • addPathPatterns():添加需要拦截的路径
  • excludePathPatterns():添加不需要拦截的路径

三、拦截器(Interceptor)

1. 拦截器基本概念

拦截器是Spring MVC提供的一种机制,用于在请求处理的不同阶段进行拦截和处理,类似于Servlet中的Filter。

2. TimeIntercept拦截器示例

package cn.wolfcode.intercept;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import java.util.Date;

public class TimeIntercept implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器执行,记录开始时间");
        long t1 = new Date().getTime();
        request.setAttribute("startTime", t1);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        Long t1 = (Long) request.getAttribute("startTime");
        long t2 = new Date().getTime();
        System.out.println(request.getRequestURI() + "耗时:" + (t2 - t1));
    }
}

3. HandlerInterceptor接口方法

preHandle()

  • 执行时机:在Controller方法执行之前
  • 返回值
    • true:继续执行后续拦截器和Controller方法
    • false:中断请求,不执行后续处理
  • 用途
    • 权限验证
    • 参数校验
    • 记录请求开始时间
    • 登录状态检查

postHandle()

  • 执行时机:在Controller方法执行之后,视图渲染之前
  • 参数
    • modelAndView:Controller返回的模型和视图对象
  • 用途
    • 修改模型数据
    • 记录请求处理时间
    • 添加公共数据到模型

afterCompletion()

  • 执行时机:在视图渲染完成之后
  • 用途
    • 资源清理
    • 记录日志
    • 异常处理

4. 拦截器执行顺序

请求 → preHandle1 → preHandle2 → Controller → postHandle2 → postHandle1 → afterCompletion2 → afterCompletion1 → 响应

注意: 多个拦截器的执行顺序是先进后出(栈结构)

四、配置类与拦截器完整流程

1. 创建拦截器类

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 前置处理逻辑
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        // 后置处理逻辑
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // 完成后处理逻辑
    }
}

2. 创建Web配置类

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Bean
    public MyInterceptor myInterceptor() {
        return new MyInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/login", "/static/**");
    }
}

五、常见应用场景

1. 登录验证拦截器

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    String uri = request.getRequestURI();
    if (uri.contains("/login")) {
        return true;
    }
    
    HttpSession session = request.getSession();
    if (session.getAttribute("user") == null) {
        response.sendRedirect("/login");
        return false;
    }
    return true;
}

2. 请求耗时统计

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    request.setAttribute("startTime", System.currentTimeMillis());
    return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
    Long startTime = (Long) request.getAttribute("startTime");
    long endTime = System.currentTimeMillis();
    System.out.println("请求耗时:" + (endTime - startTime) + "ms");
}

3. 跨域处理

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type,Authorization");
    return true;
}

六、拦截器与Filter的区别

特性 拦截器 Filter
所属框架 Spring MVC Servlet
作用范围 只拦截Controller请求 拦截所有请求
访问Spring容器 可以访问 不能直接访问
执行时机 DispatcherServlet之后 DispatcherServlet之前
配置方式 Java配置类 @WebFilter或web.xml
灵活性 更灵活 相对简单

七、注意事项

  1. 拦截器必须注册:创建拦截器后,必须在Web配置类中注册才能生效
  2. 返回值控制:preHandle返回false会中断请求链
  3. 路径匹配/**匹配所有路径,包括子路径
  4. 排除路径:静态资源、登录页面等通常需要排除
  5. 异常处理:在afterCompletion中处理异常
  6. 性能考虑:拦截器逻辑尽量简洁,避免影响性能

八、最佳实践

  1. 职责单一:每个拦截器只负责一个功能
  2. 合理使用:能用Filter解决的简单问题优先使用Filter
  3. 日志记录:在拦截器中添加适当的日志
  4. 异常处理:妥善处理拦截器中的异常
  5. 性能监控:使用拦截器监控接口性能
  6. 权限控制:使用拦截器实现统一的权限验证
posted on 2026-01-31 09:29  关羽飞  阅读(3)  评论(0)    收藏  举报