过滤器
AI-摘要
Smith GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
了解更多
过滤器
Smith这两段代码是 Spring Boot 电商项目中实现「登录权限校验」的核心拦截器代码。简单来说,它们的作用是:拦截所有请求,检查用户是否登录,没登录就不让访问受保护的接口。
第一段代码:AppInterceptor.java(核心拦截逻辑)
这是拦截器的「大脑」,负责具体的登录校验逻辑。
1. 类上的注解和接口
1 | // 把这个类交给 Spring 管理,变成 Spring 的一个「Bean」(可以理解为 Spring 能直接用的工具) |
@Component:告诉 Spring:“这个类是我的组件,你帮我管理它,我后面要用到它。”HandlerInterceptor:Spring MVC 提供的拦截器接口,有 3 个方法(我们主要用第一个)。
2. 白名单常量
1 | private final static String URL_ACCOUNT = "/account"; // 账户相关接口(比如登录、注册) |
这是**「白名单」:这些路径的接口不需要登录就能访问**(比如你总不能让用户“登录之后才能访问登录接口”吧?)。
3. 注入 Redis 工具
1 | // 从 Spring 容器里拿一个已经配置好的 RedisComponent 对象 |
RedisComponent:这是项目里封装好的 Redis 工具类,用来从 Redis 里“查用户有没有登录”。- 为什么用 Redis?:登录信息存在 Redis 里,分布式系统(多台服务器)都能共享,性能也快。
4. 核心方法:preHandle(请求前拦截)
这是最重要的方法,在请求到达 Controller(接口层)之前执行。返回 true 就“放行”,返回 false 或抛异常就“拦截”。
1 |
|
这里的逻辑流程(人话版):
- 先看看请求是不是“正常请求”(handler 不为空)。
- 如果是图片、CSS 这些静态文件,直接放行(不拦截)。
- 如果是登录、注册、传文件这些“白名单接口”,直接放行(不用登录)。
- 从请求头里拿
token(用户登录后服务器给的“门票”)。 - 如果没拿到
token,说明没登录,直接报错。 - 拿着
token去 Redis 里查:“这个用户登录了吗?” - Redis 里查不到,说明
token过期了,直接报错。 - 都没问题,放行!请求可以去 Controller 了。
5. 另外两个方法(暂时没用)
1 |
|
第二段代码:WebAppConfigurer.java(拦截器配置类)
这是拦截器的「安装手册」,负责把刚才的 AppInterceptor 注册到 Spring 里,让它生效。
1. 类上的注解和接口
1 | // 告诉 Spring:这是一个「配置类」,里面装的是配置信息 |
@Configuration:相当于告诉 Spring:“这是我的配置文件,你要按这里面的规则来。”WebMvcConfigurer:Spring MVC 提供的配置接口,用来配置拦截器、静态资源等。
2. 注入拦截器
1 |
|
3. 核心方法:addInterceptors(注册拦截器)
1 |
|
addInterceptor(appInterceptor):把我们写的拦截器加进去。addPathPatterns("/**"):拦截所有请求(/**是通配符,代表所有路径)。
4. 其他空方法(以后可以扩展)
1 |
|
整体流程(人话总结)
- 用户发请求:比如访问“我的订单”接口。
- 被拦截器拦住:
WebAppConfigurer配置了拦截所有请求,所以请求先到AppInterceptor。 - 检查白名单:“我的订单”不是白名单,继续检查。
- 查 token:从请求头拿 token,看看有没有。
- 查 Redis:拿着 token 去 Redis 里查用户是不是登录了。
- 放行/报错:都没问题就放行,请求到 Controller;有问题就抛异常(比如“未登录”)。
关键知识点补充
- 拦截器(Interceptor):Spring MVC 里的“过滤器”,专门拦截请求,做权限校验、日志记录等。
- Token:用户登录后服务器给的“门票”,每次请求都要带在请求头里,证明“我是我”。
- Redis:一个内存数据库,存登录信息特别快,而且多台服务器能共享。
- 白名单:不需要登录就能访问的接口(比如登录、注册、忘记密码)。



