JWTToken超时刷新策略

背景:项目使用的shiro+jwt来做整套权限加请求安全验证,但是jwt的token自己没有超时刷新机制,所以这里简单贴出解决方案。解决方案使用Cache做缓存(使用redis也可以,效果相同)。

 /**
     * JWTToken刷新生命周期
     * 1、登录成功后将用户的JWT生成的Token作为k、v存储到cache缓存里面(这时候k、v值一样)
     * 2、当该用户在次请求时,通过JWTFilter层层校验之后会进入到doGetAuthenticationInfo进行身份验证
     * 3、当该用户这次请求JWTToken值还在生命周期内,则会通过重新PUT的方式k、v都为Token值,缓存中的token值生命周期时间重新计算(这时候k、v值一样)
     * 4、当该用户这次请求jwt生成的token值已经超时,但该token对应cache中的k还是存在,则表示该用户一直在操作只是JWT的token失效了,程序会给token对应的k映射的v值重新生成JWTToken并覆盖v值,该缓存生命周期重新计算
     * 5、当该用户这次请求jwt在生成的token值已经超时,并在cache中不存在对应的k,则表示该用户账户空闲超时,返回用户信息已失效,请重新登录。
     * 6、每次当返回为true情况下,都会给Response的Header中设置Authorization,该Authorization映射的v为cache对应的v值。
     * 7、注:当前端接收到Response的Header中的Authorization值会存储起来,作为以后请求token使用
     * @param userName
     * @param passWord
     * @return
     */
    public boolean jwtTokenRefresh(String userNa
### 实现JWT Token自动续签机制 在现代Web应用中,JSON Web Tokens (JWT) 是一种广泛使用的身份验证方法。由于JWT的一次性和无状态特性[^1],一旦颁发便不可更改其内容,因此当JWT过期时,需要通过特定的方式重新获取有效的访问令牌。 #### 使用双令牌模式实现自动续签 为了提高安全性并简化用户体验,在实际开发过程中常采用双令牌策略——即`access_token` 和 `refresh_token` 结合使用的方法来解决这一问题。其中: - **Access Token**: 主要用于客户端向服务端发起请求的身份验证凭证;考虑到安全因素,通常将其有效期设得较短(例如30分钟)以减少泄露风险[^2]。 - **Refresh Token**: 当用户的`access_token`即将或已经失效时,可以利用此长期有效(比如7天)的令牌换取新的`access_token`而无需再次输入用户名密码完成整个登录流程[^5]。 具体来说,每当用户成功登录后,服务器会返回一对新生成的`access_token`和`refresh_token`给前端存储起来。之后每次HTTP请求都会携带当前可用的`access_token`作为认证依据。如果遇到因超时等原因导致该令牌不再合法的情况,则可以通过发送带有`refresh_token`的新请求到专门设计好的接口处去申请更新后的`access_token`继续正常使用直至下次真正意义上的登出操作为止。 下面是基于上述原理的一个简单的前后端交互逻辑示意图以及相应的代码片段展示如何处理这种情况下的token刷新过程: ```javascript // 客户端 JavaScript 伪代码 axios.interceptors.response.use( response => { return response; }, error => { const originalRequest = error.config; if(error.response.status === 401 && !originalRequest._retry){ originalRequest._retry = true; // 防止无限循环 return axios.post('/auth/refresh', { grant_type: 'refresh_token', refresh_token: localStorage.getItem('refreshToken') }).then(res=>{ if(res.data.access_token){ localStorage.setItem('accessToken', res.data.access_token); originalRequest.headers['Authorization'] = 'Bearer '+res.data.access_token; return axios(originalRequest); // 重试原始请求 } }); } return Promise.reject(error); } ); ``` 以上JavaScript代码展示了如何配置Axios拦截器以便于透明地执行token刷新动作而不影响其他业务逻辑部分的工作流。这里假设存在一个名为 `/auth/refresh` 的API端点负责接收来自客户端提交过来的`refresh_token` 并据此发放最新的`access_token`供后续调用所用[^4]。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值