过滤器

这两段代码是 Spring Boot 电商项目中实现「登录权限校验」的核心拦截器代码。简单来说,它们的作用是:拦截所有请求,检查用户是否登录,没登录就不让访问受保护的接口

第一段代码:AppInterceptor.java(核心拦截逻辑)

这是拦截器的「大脑」,负责具体的登录校验逻辑

1. 类上的注解和接口

1
2
@Component // 把这个类交给 Spring 管理,变成 Spring 的一个「Bean」(可以理解为 Spring 能直接用的工具)
public class AppInterceptor implements HandlerInterceptor { // 实现 HandlerInterceptor 接口,这是 Spring MVC 拦截器的标准接口
  • @Component:告诉 Spring:“这个类是我的组件,你帮我管理它,我后面要用到它。”
  • HandlerInterceptor:Spring MVC 提供的拦截器接口,有 3 个方法(我们主要用第一个)。

2. 白名单常量

1
2
private final static String URL_ACCOUNT = "/account"; // 账户相关接口(比如登录、注册)
private final static String URL_FILE = "/file"; // 文件相关接口(比如上传图片)

这是**「白名单」:这些路径的接口不需要登录就能访问**(比如你总不能让用户“登录之后才能访问登录接口”吧?)。

3. 注入 Redis 工具

1
2
@Resource // 从 Spring 容器里拿一个已经配置好的 RedisComponent 对象
private RedisComponent redisComponent; // 用来操作 Redis(存登录信息的地方)
  • RedisComponent:这是项目里封装好的 Redis 工具类,用来从 Redis 里“查用户有没有登录”。
  • 为什么用 Redis?:登录信息存在 Redis 里,分布式系统(多台服务器)都能共享,性能也快。

4. 核心方法:preHandle(请求前拦截)

这是最重要的方法,在请求到达 Controller(接口层)之前执行。返回 true 就“放行”,返回 false 或抛异常就“拦截”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 4.1 判断 handler 是否为空
if (null == handler) {
return false; // 没有处理器,直接拦截
}

// 4.2 判断是不是「Controller 的方法」
if (!(handler instanceof HandlerMethod)) {
return true; // 如果不是(比如是静态资源:图片、CSS),直接放行
}

// 4.3 判断是不是「白名单接口」
// 检查请求路径里有没有 /account、/file、/tool 这些关键词
if (request.getRequestURI().contains(URL_ACCOUNT)
|| request.getRequestURI().contains(URL_FILE)
|| request.getRequestURI().contains("/tool")) {
return true; // 是白名单,放行(不需要登录)
}

// 4.4 从请求头里拿「token」(登录凭证)
String token = request.getHeader(Constants.TOKEN_ADMIN); // Constants.TOKEN_ADMIN 是常量,比如 "token"

// 4.5 检查 token 是不是空的
if (StringTools.isEmpty(token)) {
throw new BusinessException(ResponseCodeEnum.CODE_901); // 抛异常:CODE_901 一般是「未登录」
}

// 4.6 从 Redis 里查「登录信息」
Object sessionObj = redisComponent.getLoginInfo4Admin(token);

// 4.7 检查 Redis 里有没有登录信息
if (sessionObj == null) {
throw new BusinessException(ResponseCodeEnum.CODE_901); // 抛异常:token 无效或过期了
}

// 4.8 所有检查都通过,放行!
return true;
}

这里的逻辑流程(人话版):

  1. 先看看请求是不是“正常请求”(handler 不为空)。
  2. 如果是图片、CSS 这些静态文件,直接放行(不拦截)。
  3. 如果是登录、注册、传文件这些“白名单接口”,直接放行(不用登录)。
  4. 从请求头里拿 token(用户登录后服务器给的“门票”)。
  5. 如果没拿到 token,说明没登录,直接报错。
  6. 拿着 token 去 Redis 里查:“这个用户登录了吗?”
  7. Redis 里查不到,说明 token 过期了,直接报错。
  8. 都没问题,放行!请求可以去 Controller 了。

5. 另外两个方法(暂时没用)

1
2
3
4
5
6
7
8
9
10
11
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 请求处理完、视图渲染前执行(这里没写逻辑,直接用父类的)
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 整个请求结束后执行(这里也没写逻辑)
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}

第二段代码:WebAppConfigurer.java(拦截器配置类)

这是拦截器的「安装手册」,负责把刚才的 AppInterceptor 注册到 Spring 里,让它生效。

1. 类上的注解和接口

1
2
@Configuration // 告诉 Spring:这是一个「配置类」,里面装的是配置信息
public class WebAppConfigurer implements WebMvcConfigurer { // 实现 WebMvcConfigurer,Spring MVC 的配置接口
  • @Configuration:相当于告诉 Spring:“这是我的配置文件,你要按这里面的规则来。”
  • WebMvcConfigurer:Spring MVC 提供的配置接口,用来配置拦截器、静态资源等。

2. 注入拦截器

1
2
@Resource
private AppInterceptor appInterceptor; // 把刚才写的 AppInterceptor 注入进来

3. 核心方法:addInterceptors(注册拦截器)

1
2
3
4
5
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 把 appInterceptor 注册进去,并且拦截「所有请求」(/** 表示所有路径)
registry.addInterceptor(appInterceptor).addPathPatterns("/**");
}
  • addInterceptor(appInterceptor):把我们写的拦截器加进去。
  • addPathPatterns("/**"):拦截所有请求(/** 是通配符,代表所有路径)。

4. 其他空方法(以后可以扩展)

1
2
3
4
5
6
7
8
9
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 配置消息转换器(比如把对象转成 JSON,这里暂时没写)
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 配置静态资源映射(比如把 /upload/** 映射到本地文件夹,这里暂时没写)
}

整体流程(人话总结)

  1. 用户发请求:比如访问“我的订单”接口。
  2. 被拦截器拦住WebAppConfigurer 配置了拦截所有请求,所以请求先到 AppInterceptor
  3. 检查白名单:“我的订单”不是白名单,继续检查。
  4. 查 token:从请求头拿 token,看看有没有。
  5. 查 Redis:拿着 token 去 Redis 里查用户是不是登录了。
  6. 放行/报错:都没问题就放行,请求到 Controller;有问题就抛异常(比如“未登录”)。

关键知识点补充

  • 拦截器(Interceptor):Spring MVC 里的“过滤器”,专门拦截请求,做权限校验、日志记录等。
  • Token:用户登录后服务器给的“门票”,每次请求都要带在请求头里,证明“我是我”。
  • Redis:一个内存数据库,存登录信息特别快,而且多台服务器能共享。
  • 白名单:不需要登录就能访问的接口(比如登录、注册、忘记密码)。