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成功返回数据";
}
相关推荐
chools12 小时前
Java后端拥抱AI开发之个人学习路线 - - Spring AI【第三期】(向量数据库 + RAG检索增强生成)
java·人工智能·学习·spring·ai
花千树-01012 小时前
Java 实现 ReAct Agent:工具调用与推理循环
java·spring boot·ai·chatgpt·langchain·aigc·ai编程
不早睡不改名@13 小时前
Netty源码解析---FastThreadLocal-addToVariablesToRemove方法详解
java·网络·笔记·学习·netty
小信丶13 小时前
Spring MVC @SessionAttributes 注解详解:用法、场景与实战示例
java·spring boot·后端·spring·mvc
no245441013 小时前
深度解析:WebP会在几年内取代JPG吗?
java·大数据·人工智能·科技·ai
William Dawson13 小时前
【Java Stream 流:高效、优雅的集合操作 ✨】
java·windows·python
疯狂成瘾者13 小时前
SseEmitter
java
Vic1010113 小时前
Java深度分页性能优化:从问题本质到生产实践
java·adb·性能优化
爱丽_13 小时前
Redis 持久化与高可用:RDB/AOF、主从复制、哨兵与一致性取舍
java·后端·spring
伯远医学13 小时前
如何判断提取的RNA是否可用?
java·开发语言·前端·javascript·人工智能·eclipse·创业创新