接口请求处理流程

概述

本文档详细描述了 /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}

特殊说明

  1. 匿名访问权限 :在 SecurityConfig 中,/app/** 路径被配置为允许匿名访问,这意味着登录请求不会受到 JWT 认证过滤器的限制。

  2. 过滤器执行顺序

    • CorsFilter(最高优先级)
    • 其他 Spring Security 过滤器
    • JwtAuthenticationTokenFilter
    • RepeatableFilter(最低优先级)
  3. 请求体重复读取:RepeatableFilter 的主要目的是确保请求体可以被多次读取,这对于日志记录、参数解析等操作非常有用。

相关推荐
咩咩啃树皮6 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚7 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白8 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司9 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地10 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415910 小时前
TCP超时重传机制是为了解决什么问题?
java
莫逸风13 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z1234567898613 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112314 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
做个文艺程序员14 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus