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();
相关推荐
砍材农夫41 分钟前
spring|spring web|拦截器、过滤器、aop
java·spring boot·spring·spring cloud
考虑考虑7 小时前
docker compose V2版本新属性
运维·后端·自动化运维
mldong8 小时前
一个 App,十三套后端:手机审批端 uni-jeeflow-app 开源了
java·架构
tqs_123459 小时前
MySQL RR隔离级别死锁|Gap间隙锁、临键锁,订单并发范围查询死锁根因方案
java
逆境不可逃9 小时前
Pi Agent 学习笔记:多个工具怎样并行执行
java
weixin_BYSJ19879 小时前
【计算机毕设】基于SpringBoot与Vue的文物保护档案管理系统08621
vue.js·spring boot·spring cloud·微服务·架构·django·课程设计
GreenTea9 小时前
7000 万 QPS、500 PB:OpenAI 如何用一个 Python 存储平台撑住 10 亿用户
后端·架构
Flynt10 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet10 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
GreenTea10 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法