@Component
@Slf4j
public class TokenCheckInterceptor implements HandlerInterceptor {
/**
* 解析 token
*/
@Resource(name = "jwtDecoderConfig")
private JwtDecoder jwtDecoderClassPath;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
if (handler instanceof ResourceHttpRequestHandler) {
return true;
}
//return true;
Map<String, Object> userInfo;
try {
final String basicKey = "Bearer";
String header = request.getHeader("Authorization");
if (StringUtils.isBlank(header)) {
log.info("Token is null");
responseError(response, "Token is null");
return false;
}
if (!header.contains(basicKey)) {
log.info("header config error, no ===========> {}", basicKey);
responseError(response, "header config error, no " + basicKey);
return false;
}
//获取 token
String basicToken = header.split(basicKey)[1].trim();
// 解析 token
userInfo = jwtDecoderClassPath.getInfoFromToken(basicToken);
if (userInfo == null) {
log.info("User is empty, 请重新登录!!!");
responseError(response, "User is empty, 请重新登录!!!");
return false;
}
BasicUser basicUser = new BasicUser();
BeanUtils.populate(basicUser, userInfo);
if (OrderConstant.BOSS.equals(basicUser.getChannel())) {
if (basicUser.getUserId() == null || StringUtils.isBlank(basicUser.getUserType())) {
log.info("User is empty, 请重新登录!!!");
responseError(response, "User is empty, 请重新登录!!!");
return false;
}
}else {
if (basicUser.getMemberId() == null) {
log.info("User is empty, 请重新登录!!!");
responseError(response, "User is empty, 请重新登录!!!");
return false;
}
}
log.info("Parse the user information as ===========> {}", userInfo);
ThreadLocalCache.set("basicUser", basicUser);
return true;
}catch (Exception e) {
log.error("Parse token exception, {}, {}", e.getMessage(), e);
responseError(response, "User is empty, 请重新登录!!!");
return false;
}
}
private void responseError(HttpServletResponse response, String message) {
PrintWriter writer=null;
try {
response.setContentType(OrderConstant.CONTENT_TYPE_JSON);
//设置编码,否则中文字符在重定向时会变为空字符串
writer= response.getWriter();
writer.write(JSON.toJSONString(DataMessageWrapper.failureMessage(message)));
} catch (IOException e) {
log.error("用户信息校验失败:{}",message,e);
}finally {
if(writer!=null){
writer.close();
}
}
}
}
Interceptor 中校验 token
最新推荐文章于 2023-07-27 16:54:48 发布