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

配置类与拦截器

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;@Beanpublic User user1() {return new User(name, password);}@Beanpublic 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: adminpassword: 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 {@Autowiredprivate TimeIntercept timeIntercept;@Beanpublic TimeIntercept timeIntercept() {return new TimeIntercept();}@Overridepublic 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 {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("拦截器执行,记录开始时间");long t1 = new Date().getTime();request.setAttribute("startTime", t1);return true;}@Overridepublic 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 {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 前置处理逻辑return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {// 后置处理逻辑}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {// 完成后处理逻辑}
}

2. 创建Web配置类

@Configuration
public class WebConfiguration implements WebMvcConfigurer {@Beanpublic MyInterceptor myInterceptor() {return new MyInterceptor();}@Overridepublic 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. 权限控制:使用拦截器实现统一的权限验证
http://www.jsqmd.com/news/325123/

相关文章:

  • 2026珠宝定制品牌推荐测评:谁是真正值得信赖的“克拉自由”缔造者?
  • 揭秘云端巨兽:AWS S3 如何在百亿亿级规模下重塑存储与 AI 的未来
  • 2026年优秀的自助码垛机/码垛机厂家选购指南与推荐
  • 2026年质量好的全涤韩国绒/韩国绒高评价厂家推荐榜
  • 2026适合企业的费用管理系统排行及选型参考
  • 定制钻戒哪个好?2026培育钻戒选购终极攻略:这些高性价比品牌别错过!
  • 集中通报批评!教授给研究生发放劳务费后再回收,以此套取科研经费!
  • springbootCRUD
  • 2026年费用管理系统推荐:助力企业高效财务管控
  • 2026年口碑好的注塑机清洗料/流延膜机清洗料厂家最新热销排行
  • 2026年知名的直贴生态板/轻奢风生态板用户好评厂家排行
  • 2026年靠谱的景区策划/主题公园景区策划全国优质服务推荐榜
  • 定制钻戒哪个好?2026年高性价比国产培育钻品牌深度推荐指南
  • 2026靠谱的费用管理系统公司有哪些?行业应用指南
  • 技术人数字资产管理:从PDF混沌到结构化知识库的工程实践
  • 2026年职业教育升学班需要多少分,安徽万通技师学院为你解惑
  • 科学验配 + 权威背书:2025 五大助听器品牌推荐,精准适配不同听损需求
  • 2007-2025年地级市公共安全维护数据DID
  • 2026年合肥双向流新风系统厂家排名,哪家品牌靠谱又好用?
  • 全自动切管机销售厂家哪家可靠?
  • 2026年直流送风风机靠谱品牌推荐,生产厂哪个值得选揭晓
  • 选购新风机要注意什么,推荐几家靠谱的新风机厂家
  • 1998-2024年上市公司企业税费统计、税收优惠、税费返还数据
  • 二分搜索算方
  • 计算机毕设Java基于Web的应急救援医疗器材管理平台的设计与实现 基于Java Web的应急医疗设备管理系统的设计与开发 Java Web环境下应急救援医疗器械管理平台的构建与实现
  • 2026年浙江靠谱的充电桩生产商排名,充电桩来样定制超良心
  • 2026年比较好的动漫IP授权/日漫IP授权综合竞争力排行榜
  • 聊聊西安直流送风风机正规供应商排名,前十名有哪些
  • 计算机毕设java高校多媒体教室管理系统 Java技术驱动的高校多媒体教室智能管理系统开发 基于Java的高校多媒体教室综合管理平台设计与实现
  • 充电桩智能厂家哪家好,对比评测为你揭晓答案