什么是无感刷新及其实现方式
- 1226字
- 6分钟
- 2024-08-09
无感刷新是一种机制,允许前端应用在令牌快要过期时自动请求新的令牌,而不需要用户的干预。这种方法可以提高用户体验,避免因令牌过期导致的登录中断。
实现无感刷新的常见方法
Token过期时间管理
- 当用户登录后,前端通常会存储访问令牌(如JWT)和刷新令牌。
- 访问令牌通常有较短的有效期(如15分钟),而刷新令牌有效期较长(如7天)。
- 前端在访问令牌即将过期时(例如还剩2分钟时),主动使用刷新令牌向后台请求新的访问令牌。
拦截器(Interceptor)
- 前端应用可以使用拦截器(如在Axios或Fetch中)拦截所有请求。
- 如果检测到当前访问令牌已过期,拦截器会先使用刷新令牌获取新的访问令牌,再重新发送原始请求。
- 这样,用户感知不到任何中断,应用也保持了连续的操作。
无感刷新逻辑
- 设置一个定时器,在令牌即将过期前自动触发刷新操作。
- 定期检查令牌的有效期,如果令牌快要过期则自动刷新,防止用户操作被中断。
- 如果刷新令牌也失效,则将用户重定向到登录页面。
Silent Authentication(静默认证)
- 对于部分前端应用,可以使用隐藏的iFrame来进行静默认证,利用SSO机制在后台完成令牌的刷新,而不影响前台的用户操作。
Axios 拦截器实现示例
以下是一个完整的Axios拦截器实现的代码,用于处理JWT令牌的自动刷新和请求重试。在这个示例中,假设你已经有一个后端API可以提供刷新令牌的功能。
1. 创建Axios实例
首先,我们需要创建一个Axios实例,并配置请求拦截器和响应拦截器。
2. 添加请求拦截器
在每个请求中添加Authorization头部,以便将JWT访问令牌包含在请求中。
3. 添加响应拦截器
处理401错误,并在令牌过期时使用刷新令牌获取新的访问令牌。
代码解释
-
Axios实例化:
使用axios.create()创建一个自定义的Axios实例apiClient,可以指定基础URL和其他配置。
-
请求拦截器:
在每个请求发出之前,检查是否存在JWT访问令牌,如果存在,则将其添加到请求头部Authorization中。
-
响应拦截器:
- 处理401错误:当服务器返回401未授权错误时,意味着令牌可能已过期。
- 刷新令牌:如果刷新令牌存在,发送请求到刷新令牌的API端点以获取新的访问令牌。
- 更新令牌:将新的令牌存储到本地,并更新Axios实例的默认请求头,以便在后续请求中使用新的令牌。
- 重试原始请求:使用新的令牌重新发送原始请求。
-
刷新令牌失败:
如果刷新令牌无效或已过期,清除本地存储的令牌并将用户重定向到登录页面。
如何使用
在应用中,可以使用apiClient
代替原始的Axios实例来发送HTTP请求:
这段代码通过封装的apiClient
发送请求,自动处理令牌的刷新和重试逻辑。
总结
通过以上方法,可以在前端应用中实现无感刷新,确保用户在使用过程中不会因令牌过期而被打断。这种机制提升了用户体验,使应用更加流畅。