![2331b085931ca8c60403ff656debdddb.png](https://i-blog.csdnimg.cn/blog_migrate/9dced44ca84110b9d532c471b025e4ae.png)
违背的青春
- Spring Security(一):整合JWT实现登录功能
- Spring Security(二):获取用户权限菜单树
- Spring Security(三):与Vue.js整合
- Spring Security(四):更新前端路由获取方式
- Spring Security(五):前后端权限控制详解
- Spring Security(六):前端菜单,角色权限页面的搭建
- Spring Security(七):自定义拦截器实现对权限异常的处理
- Spring Security(八):Vue.js使用 CryptoJS加密密码以及BCryptPasswordEncoder的使用
当使用jwt
进行校验用户信息,由于jwt
是无状态的,所以最重要的就是解决刷新token
带来问题,一个简单的需求就是15天内免登录。当然最简单粗暴的方式是你可以设token
有效期为半个月嘛,这确实是一个解决方案,但是对于信息比较重要的还是不要采用这种方案,最好把token
的有效期时间设置为短一些使用refresh
刷新token
就ok。
大概流程如下图
![4af3b8880bacee4a0d2183cc4e2a785c.png](https://i-blog.csdnimg.cn/blog_migrate/5fcc454f6e5693d52258f2c7b4eef7da.jpeg)
简单解释下:现在我采取的方案是设置token
的有效期为两小时,大概流程
- 用户通过登录,后端会存储这个
token
到Redis
,key设置为userid
,value设置为token
,有效期设置为15天(如果一周免登陆,那Redis
的有效期就要设置为1周) - 如果用户在两个小时后请求数据,这个
token
是失效的,但是我们可以通过这个失效的token
获取payload
中的用户信息(我把用户id存储到了token
的payload
中),通过解析token
获取用户id,根据这个id去查到Redis
这个key值是否存在,如果还在Redis
有效期内我们就可以重新签发token
返回给前端,前端把之前存储的token
替换为现在得,周而复始, - 如果时间过了规定的免登录时间那
Redis
中,token
会失效,我们只需要返回失效信息给前端处理就完事了。
关键代码:
@Slf4j
@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Resource
private RedisUtil redisUtil;
@Autowired
private UserMapper userMapper;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException {
String authHeader = request.getHeader(jwtTokenUtil.getHeader());
try {
if (authHeader != null && StringUtils.isNotEmpty(authHeader)) {
String username = jwtTokenUtil.getUsernameFromToken(authHeader);
jwtTokenUtil.validateToken(authHeader);//验证令牌
if (username != null && SecurityC