springboot项目基于拦截器实现token刷新

518 阅读2分钟

这篇文章来归纳总结一下token刷新的一些业务流程,思路。

在项目中,一般会使用到 jwt+token+redis 的方式来做用户的一个认证。

首先说一下业务流程:

token 认证业务流程

  1. 用户登录,服务端使用 jwt 根据 userId 为该用户生成 token,服务端将 token 保存在 redis 中。

  2. 用户携带token访问接口,如果该接口需要token才能访问,那么服务端获取 token,然后去 redis 进行一些查询校验,如果能够通过校验,那么就允许用户访问。

按照这个思路,我们只需要在 LoginInteceptor 拦截器中配置好哪些接口需要被拦截,然后当用户访问需要登录才能访问的接口的时候,再去校验它们的 token 即可,此时是根据该 token 去操作 redis 数据库进行校验的,如果说该 token 有效,那么我们可以给它进行一个刷新过期时间,同时放行用户。

如果用户访问的不是需要登录才能访问的接口的话,就不会被该 LoginInteceptor 拦截器拦截,也就是说服务端没有机会像上面一样操作 token,此时的用户仍然是处于登录状态,我们显然需要更新他的 token,否则用着用着突然说掉登陆了,是个很差的用户体验。

所以我们需要再添加一个 RefreshToken拦截器,业务流程是这样:

token 刷新业务流程

image.png

可以看到,我们的服务端要再增加一个 RefreshToken拦截器截器,并且需要用到 ThreadLocal 本地线程来进行逻辑判断。

RefreshToken拦截器截器 拦截的是所有请求,而 LoginInteceptor 拦截器拦截的是那些需要登录才能访问的请求.