spring boot在普通方法中获取HttpServletRequest及其使用的方式

一、通过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();
相关推荐
_童年的回忆_几秒前
【Linux】安装Jenkins并且打包发布springboot项目
linux·spring boot·jenkins
邪修king3 分钟前
UE5 TA 核心修炼:材质与纹理艺术全解 —— 从 PBR 理论到工业级材质实战
c++·后端·游戏·ue5·材质
彭于晏Yan8 分钟前
Maven 资源插件:非过滤文件后缀配置及风险规避
java·spring boot·maven
benpaodeDD8 分钟前
idea里创建maven的web项目
java
青衫码上行8 分钟前
如何接入AI大模型
java·人工智能·ai·langchain·ai编程
摇滚侠10 分钟前
并发编程 Java 面试题 真正的 offer 偏方 Java 基础 Java 高级
java·开发语言
兰令水11 分钟前
topcode【随机算法题】【2026.5.15打卡-java版本】
java·算法·leetcode
uzong16 分钟前
这套AI技术栈可将你的人工智能成本削减80%
人工智能·后端·架构
JAVA学习通2 小时前
北京明光云振铎数据科技Java面经
java·开发语言·科技
贫民窟的勇敢爷们8 小时前
SpringBoot整合AOP切面编程实战,实现日志统一记录+接口权限校验
java·spring boot·spring