SpringMVC 拦截器实现 JWT 认证和 token 刷新
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){ System.out.println('经过了拦截器-----------------------------------------------------------------------------------------------------------------------------------------------------------'); System.out.println('>>请求url - ' + request.getRequestURL());
Result result = new Result();//存放给前端返回数据
response.setCharacterEncoding('UTF-8');
response.setContentType('text/html; charset=utf-8');
Enumeration<String> params = request.getParameterNames();
while(params.hasMoreElements()){
String paramName = params.nextElement();
System.out.println('>>Parameter Name - '+paramName+', Value - '+request.getParameter(paramName));
}
if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
System.out.println('OPTIONS请求,放行');
return true;
}
//无论如何都放行。具体能不能操作还是在具体操作中去判断
//拦截器只负责把请求头中包含token的令牌进行解析验证
String header = request.getHeader('Authorization');
if(StringUtils.isEmpty(header)){
log.info('获取到的请求头为空!');
result.setCode(-3);
result.setMessage('获取到的请求头为空!');
String json = JSONObject.toJSONString(result);
returnJson(response,json);
return false;
}
//如果有包含Authorization头信息,就对其进行解析
if(header.startsWith('Bearer ')){
//得到token
String token =header.substring(7);
if (StringUtils.isEmpty(token)){
log.info('无token,请重新登陆!');
result.setCode(-2);
result.setMessage('无token,请重新登陆!');
String json = JSONObject.toJSONString(result);
returnJson(response,json);
return false;
}
//对令牌进行验证
try {
Claims claims = JwtUtil.getTokenClaim(token);
if (claims == null){
log.info('token已经过期,请重新登录!');
result.setCode(-2);
result.setMessage('token已经过期,请重新登录!');
String json = JSONObject.toJSONString(result);
returnJson(response,json);
return false;
}
String role = (String) claims.get('role');
if(role != null && role.equals('1')){
Superadmin superadmin = (Superadmin) redisTemplate.opsForValue().get(jwtUtil.getRedisKeyFromToken(token));
if (superadmin == null){
log.info('用户不存在!');
result.setCode(-2);
result.setMessage('用户不存在!请重新登录!');
String json = JSONObject.toJSONString(result);
returnJson(response,json);
return false;
}
//false表示快过期
if (jwtUtil.isExpired(token)){
log.info('token已经过期,请重新登录!');
result.setCode(-2);
result.setMessage('token已经过期,请重新登录!');
String json = JSONObject.toJSONString(result);
returnJson(response,json);
return false;
}else if (jwtUtil.checkTokenIsUse(token)){
log.info('token还有1分钟过期!重新生成token');
//对数据进行加密
String md5key = 'MRONE' + DigestUtils.md5Hex(superadmin + 'MRONE_PHONE_LOGIN');
//把用户信息存入缓存
String newRedis_token = 'newToken'+md5key;
redisTemplate.opsForValue().set(newRedis_token,superadmin, Duration.ofDays(5));
String newToken = jwtUtil.getTokenByExpire(newRedis_token,'1',jwtUtil.getExpire()*2);
result.setCode(1);
result.setMessage('token快过期,更换token!');
result.setData(newToken);
String json = JSONObject.toJSONString(result);
returnJson(response,json);
return false;
}
//权限验证
request.setAttribute('claims_superadmin',token);
}
if(role != null && role.equals('2')){
Admin admin = (Admin) redisTemplate.opsForValue().get(jwtUtil.getRedisKeyFromToken(token));
if (admin == null){
log.info('用户不存在!');
result.setCode(-2);
result.setMessage('用户不存在!请重新登录!');
String json = JSONObject.toJSONString(result);
returnJson(response,json);
return false;
}
if (jwtUtil.isExpired(token)){
log.info('token已经过期,请重新登录!');
result.setCode(-2);
result.setMessage('token已经过期,请重新登录!');
String json = JSONObject.toJSONString(result);
returnJson(response,json);
return false;
}else if (jwtUtil.checkTokenIsUse(token)){
log.info('token将要过期!重新生成token');
//对数据进行加密
String md5key = 'MRONE' + DigestUtils.md5Hex(admin + 'MRONE_PHONE_LOGIN');
//把用户信息存入缓存
String newRedis_token = 'newToken'+md5key;
redisTemplate.opsForValue().set(newRedis_token,admin, Duration.ofDays(5));
String newToken = jwtUtil.getTokenByExpire(newRedis_token,'2',jwtUtil.getExpire()*2);
log.info('新生成的newToken:'+newToken);
redisTemplate.opsForValue().set(admin.getAdminId() + 'token', newToken, Duration.ofHours(2));
result.setCode(1);
result.setMessage('token快过期,更换token!');
result.setData(newToken);
String json = JSONObject.toJSONString(result);
returnJson(response,json);
return false;
}
request.setAttribute('claims_admin',token);
}
if(role != null && role.equals('3')){
Coach coach = (Coach) redisTemplate.opsForValue().get(jwtUtil.getRedisKeyFromToken(token));
if (coach != null){
Coach coach1 = coachService.queryOneCoachByID(coach.getCoachId());
if (coach1 == null){
log.info('用户不存在!');
result.setCode(-2);
result.setMessage('用户不存在!请重新登录!');
String json = JSONObject.toJSONString(result);
returnJson(response,json);
return false;
}
//true表示过期
if (jwtUtil.isExpired(token)){
log.info('token已经过期,请重新登录!');
result.setCode(-2);
result.setMessage('token已经过期,请重新登录!');
String json = JSONObject.toJSONString(result);
returnJson(response,json);
return false;
}else if (jwtUtil.checkTokenIsUse(token)){
log.info('token将要过期!重新生成token');
//对数据进行加密
String md5key = 'MRONE' + DigestUtils.md5Hex(coach + 'MRONE_PHONE_LOGIN');
//把用户信息存入缓存
String newRedis_token = 'newToken'+md5key;
redisTemplate.opsForValue().set(newRedis_token,coach, Duration.ofDays(5));
String newToken = jwtUtil.getTokenByExpire(newRedis_token,'3',jwtUtil.getExpire()*2);
log.info('新生成的newToken:'+newToken);
result.setCode(1);
result.setMessage('token快过期,更换token!');
result.setData(newToken);
String json = JSONObject.toJSONString(result);
returnJson(response,json);
return false;
}
}
request.setAttribute('claims_coach',token);
}
if(role != null && role.equals('4')){
CarUser carUser = (CarUser) redisTemplate.opsForValue().get(jwtUtil.getRedisKeyFromToken(token));
if (carUser != null){
CarUser carUser1 = carUserService.queryOneCarUserById(carUser.getUserId());
if (carUser1 == null){
log.info('用户不存在!');
result.setCode(-2);
result.setMessage('用户不存在!请重新登录!');
String json = JSONObject.toJSONString(result);
returnJson(response,json);
return false;
}
//true表示过期
if (jwtUtil.isExpired(token)){
log.info('token已经过期,请重新登录!');
result.setCode(-2);
result.setMessage('token已经过期,请重新登录!');
String json = JSONObject.toJSONString(result);
returnJson(response,json);
return false;
}else if (jwtUtil.checkTokenIsUse(token)){
log.info('token将要过期!重新生成token');
//对数据进行加密
String md5key = 'MRONE' + DigestUtils.md5Hex(carUser + 'MRONE_PHONE_LOGIN');
//把用户信息存入缓存
String newRedis_token = 'newToken'+md5key;
redisTemplate.opsForValue().set(newRedis_token,carUser, Duration.ofDays(5));
String newToken = jwtUtil.getTokenByExpire(newRedis_token,'4',jwtUtil.getExpire()*2);
log.info('新生成的newToken:'+newToken);
result.setCode(1);
result.setMessage('token快过期,更换token!');
result.setData(newToken);
String json = JSONObject.toJSONString(result);
returnJson(response,json);
return false;
}
}
request.setAttribute('claims_user',token);
}
}catch (Exception e){
log.info('拦截器中异常-----------------------'+e.getMessage());
log.info('token已经过期,请重新登录!');
result.setCode(-2);
result.setMessage('token已经过期,请重新登录!');
String json = JSONObject.toJSONString(result);
returnJson(response,json);
return false;
}
}
long startTime = System.currentTimeMillis();
request.setAttribute('startTime', startTime);
return true;
}
原文地址: https://www.cveoy.top/t/topic/qnSd 著作权归作者所有。请勿转载和采集!