概述
本文档详细描述了 /app/login 接口的请求处理流程,包括各个过滤器和拦截器的执行顺序和作用。
请求处理流程
1. 请求进入过滤器链(Filter Chain)
当客户端发起 /app/login 请求时,会经过以下过滤器:
A. CorsFilter(跨域过滤器)
- 首先处理跨域请求
- 在 SecurityConfig 中配置为最先执行:
httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class)
B. RepeatableFilter(可重复读取过滤器)
- 注册顺序为
LOWEST_PRECEDENCE(最低优先级,最后执行) - 检查请求是否为 JSON 类型:
StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE) - 如果是 JSON 请求,则包装成
RepeatedlyRequestWrapper,使请求体可以被重复读取 - 主要作用:解决流只能读取一次的问题,便于后续处理
C. JwtAuthenticationTokenFilter(JWT 认证过滤器)
- 在
UsernamePasswordAuthenticationFilter之前执行 - 从请求头中提取 JWT Token
- 验证 Token 有效性
- 将用户信息存储到 Spring Security 上下文中
- 但是
/app/login路径在 SecurityConfig 中被配置为允许匿名访问,因此这个过滤器可能不会对登录请求进行实际的认证操作
2. Spring MVC 处理流程
A. DispatcherServlet
- Spring MVC 的核心前端控制器
- 接收所有请求并分发给相应的处理器
B. HandlerMapping
- 根据请求路径
/app/login和 POST 方法找到对应的控制器方法 - 映射到
LoginAppController.loginApp()方法
C. 拦截器(Interceptors)
- 如果有配置拦截器,会在 Controller 方法执行前后进行拦截处理
D. 数据绑定和校验
- 将请求体 JSON 数据绑定到
LoginAppParam对象 - 执行参数校验(由于使用了
@Validated注解)
3. 控制器处理
LoginAppController.loginApp()
- 路径:
POST /app/login - 方法:接收
@RequestBody LoginAppParam param - 调用
loginAppService.loginApp(param)服务方法 - 返回
R.ok("登录成功")
4. 服务层处理
LoginAppService.loginApp()
- 获取手机号和密码
- 调用
getHcry2025s(mobile)查询核查人员表 - 调用
userService.selectUserByUserName(mobile, UserTypeEnum.WEB_SYSTEM_USER.getCode())查询 Web 用户 - 验证登录凭据
- 记录登录日志
5. 数据访问层
- 通过 MyBatis 访问数据库
- 执行相应的 SQL 查询语句
6. 响应返回
- 返回 JSON 格式的响应
{"code": 200, "msg": "登录成功", "data": null}
特殊说明
-
匿名访问权限 :在 SecurityConfig 中,
/app/**路径被配置为允许匿名访问,这意味着登录请求不会受到 JWT 认证过滤器的限制。 -
过滤器执行顺序:
- CorsFilter(最高优先级)
- 其他 Spring Security 过滤器
- JwtAuthenticationTokenFilter
- RepeatableFilter(最低优先级)
-
请求体重复读取:RepeatableFilter 的主要目的是确保请求体可以被多次读取,这对于日志记录、参数解析等操作非常有用。