一、通过RequestContextHolder来获取HttpServletRequest,示例代码如下
public static AuthUser getUser(){
RequestAttributes requestAttributes= RequestContextHolder.getRequestAttributes();
ServletRequestAttributes servletRequestAttributes=(ServletRequestAttributes)requestAttributes;
//获取http请求,这步是关键
HttpServletRequest httpServletRequest = servletRequestAttributes.getRequest();
//从请求属性中获取
Object user= httpServletRequest.getAttribute("SYSTEM_CURRENT_USER");
if(user!=null){
return (AuthUser) user;
}
//从请求头获取
String token=httpServletRequest.getHeader("TP-Auth");
if(StringUtils.isBlank(token)){
return new AuthUser();
}
//如果不存在则从token中进行解析
Map<String, Object> tokenMap=JwtUtil.getTokenInform(token);
AuthUser authUser=AuthUser.builder().userId(Long.valueOf(tokenMap.get("userId").toString()))
.userName(tokenMap.get("userName").toString())
.userAccount(tokenMap.get("userAccount").toString())
.userType(Integer.valueOf(tokenMap.get("userType").toString()))
.deptIds(tokenMap.get("userDeptIds").toString())
.roleIds(tokenMap.get("userRoleIds").toString())
.postIds(tokenMap.get("userPostIds").toString())
.tenantId(Long.valueOf(httpServletRequest.getHeader("tenantId")))
.build();
return authUser;
}
二、关于自定义线程获取失败的问题,需要手动获取一下,示例程序如下:
//获取主线程的上下文
RequestAttributes context = RequestContextHolder.getRequestAttributes();
new Thread(()->{
if (context!=null){
//👌传递并且设置上下文
RequestContextHolder.setRequestAttributes(context);
System.out.println("自定义线程");
AuthUser user1= AuthUserUtils.getUser();
System.out.println(user1);
}
}).start();