SpringMVC上下文对象

SpringMVC上下文对象

在有些情况下,就算加了过滤器后我们现在还不能在 controller 层将 session 代码去掉!因为在实际业务中对用户对象操作是非常常见的,而我们的业务代码一般都写在 Service 业务层,那么我们 Service 层想要操作用户对象还得从 Controller 那传参过来,就像这样:

java 复制代码
@GetMapping("api")
public String api(HttpSession session) {
    User user = (User) session.getAttribute("user");
    // 将用户对象传递给Service层
    userService.doSomething(user);
    return "成功返回数据";
}

每个接口都要这么写太麻烦了,有没有什么办法可以让我直接在 Service 层获取到用户对象呢?当然是可以的,我们可以通过 SpringMVC 提供的 RequestContextHolder 对象在程序任何地方获取到当前请求对象,从而获取我们保存在 HttpSession 中的用户对象。我们可以写一个上下文对象来实现该功能:

java 复制代码
public class RequestContext {
    public static HttpServletRequest getCurrentRequest() {
        // 通过`RequestContextHolder`获取当前request请求对象
        return ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
    }

    public static User getCurrentUser() {
        // 通过request对象获取session对象,再获取当前用户对象
        return (User)getCurrentRequest().getSession().getAttribute("user");
    }
}

然后我们在Service层直接调用我们写的方法就可以获取到用户对象啦:

java 复制代码
public void doSomething() {
    User user = RequestContext.getCurrentUser();
    System.out.println("service层---当前登录用户对象:" + user);
}

我们再在Controller层直接调用Service:

java 复制代码
@GetMapping("api")
public String api() {
    // 各种业务操作
    userService.doSomething();
    return "api成功返回数据";
}
相关推荐
我星期八休息9 分钟前
Linux I/O多路转接—epoll
java·linux·运维·服务器·开发语言·jvm·算法
学长毕业设计35 分钟前
基于springboot的云南中草药知识普及管理网站的设计与开发(源码+文档+讲解视频)
java·spring boot·后端
大模型码小白37 分钟前
AI 提示词专栏:使用系统指令(System Prompt)实现全局约束
java·大数据·运维·开发语言·人工智能·python·prompt
cxoptics43 分钟前
蓝宝石的轴向在窗片和偏振片中起的作用
java
wuminyu1 小时前
Java FFM处理网络读写事件源码剖析
java·linux·c语言·jvm·c++
小江的记录本1 小时前
【AI Agent】《2026年9月 AI Agent全栈开发技术选型专项面试宝典》
java·spring boot·python·spring·ai·面试·ai编程
梦梦代码精2 小时前
《LikeShop全产品技术硬核拆解:ThinkPHP8+Vue3+UniApp架构,私有化部署与二次开发实战指南》
java·低代码·系统架构·php·开源软件
一木 之林2 小时前
C/C++ 面向对象编程(OOP)(进阶)
java·c语言·c++
摇滚侠2 小时前
《SpringBoot 3:入门与应用实战》第 9 章 使用 WebMvc 开发应用 阅读笔记 2
java·spring boot·笔记
technology_x2 小时前
液冷超充站设备厂家哪家好?2026年功率与散热对比
java·开发语言