一、通过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();
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐