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();
相关推荐
__zRainy__几秒前
Node系列 · 数据库:MySQL 安装
数据库·后端·mysql·node.js
Zane19941 分钟前
threading、multiprocessing、asyncio 到底怎么选?一张图 + 三组实测数据说清楚
后端·python
CodeStats6 分钟前
【Java进程通信】Java进程通信系统完全指南:从ProcessBuilder底层原理到多语言实战
java·前端·python·进程·ai编程·processbuilder
绿智校园8 分钟前
物联网平台选型指南:为什么底层协议自研比云端SDK接入更可靠?
java·物联网·struts
T01156188 分钟前
艺培场馆课时预约小程序用户端 & 后台联动踩坑上篇(预约、课时、缓存、消息、学员端自身问题)
java·缓存·小程序·bug·全栈项目实战手记·艺培课时系统‘’
长谷深风11110 分钟前
AI Agent 踩坑:盲目重试会把小故障炸成系统灾难
java·大数据·ai·agent·ai agent·工具调用·agent设计
程序员cxuan16 分钟前
DeepSeek 多模态深度实测,确实有东西的
人工智能·后端·程序员
evans在进步35 分钟前
Spring Boot 核心机制详解:自动装配、事件监听、异步任务与请求映射
java·spring boot·后端
程序员cxuan40 分钟前
一招让你的 Claude 被封了也能用
人工智能·后端·程序员
Zane199440 分钟前
HashSet、TreeSet、LinkedHashSet:底层都是"套壳"
java·后端