注册token拦截器
在WebConfig配置类里,需要将token拦截器注册到Spring MVC里,Spring MVC作为Spring框架里的大管家,负责HTTP调用链的资源调用与管理,需要让Spring MVC知道有这个拦截器,并且告诉他这个拦截器需要在什么时候执行、对哪些接口生效。
用户登录
登录过程中前端传账号密码,后端在核实登录信息正确后使用当前时间戳+过期时长+秘钥生成一个token,再将token作为key、user_id作为value、设置过期时长和单位存入redis缓存数据库。
客户端发起 HTTP 请求
客户端发送http访问后端需要token校验的Controller层接口,服务端(正在运行的这个Spring Boot应用)接收HTTP请求后交给Servlet。
Servlet容器阶段
servlet在负责监听端口的时候接收到网络上的HTTP请求,会从自己的线程池里取一个工作线程来处理这次请求,再将请求交给应用内的处理链Spring MVC 的DispatcherServlet核心入口。
Spring MVC找到需要执行的Controller
Spring MVC的DispatcherServlet会首先根据请求方式和请求路径找到匹配的Handler,在真正调用Controller之前,会先执行HandlerInterceptor拦截器链的preHandle()。
拦截器阶段
拦截器会放行不需要token校验接口、通过org.springframework.web.servlet.HandlerInterceptor.getHeader方法获取请求头、通过io.jsonwebtoken.Jwts.parser方法核实token格式和是否过期、在redis中通过token获取user_id(如果没有获取成功代表token无效)、将user_id放在一个ThreadLocal(同一个线程里,只要能拿到ThreadLocal实例,就可以在该线程任何位置调用get()取到值)中。
Controller阶段
在Controller里通过获取ThreadLocal实例拿到user_id,DispatcherServlet写回HTTP响应,在调用链最后会执行拦截器的afterCompletion()方法,避免线程复用导致串号。