You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringMVC中如何在不同控制器间访问Session变量?

解决Spring MVC跨控制器访问Session变量时的空指针异常

看起来你在Spring MVC里遇到了Session共享的问题——登录时存了username到Session,但在ProfileController里拿的时候出现空指针。我帮你梳理几个常见的排查方向和解决办法:

1. 先确认请求是否正确携带Session凭证

浏览器和服务器之间是通过JSESSIONID Cookie来关联Session的,要是后续请求没带这个Cookie,服务器会创建一个全新的空Session,自然拿不到之前存的username。你可以用浏览器F12的Network面板检查:

  • 看登录请求的响应头里有没有Set-Cookie: JSESSIONID=xxx; Path=/;...(这是服务器给你设置的Session标识)
  • 再看访问/getUserData的请求头里有没有Cookie: JSESSIONID=xxx(要和登录响应里的ID完全一致)

如果是前后端分离的场景,前端请求必须开启携带凭证的配置:比如用axios的话要加withCredentials: true,同时后端要在跨域配置里允许携带凭证(比如Spring Boot里用@CrossOrigin(allowCredentials = true))。

2. 检查Session获取逻辑,避免创建新的空Session

你现在用的req.getSession(),这个方法的默认行为是:如果当前请求没有关联的Session,就自动创建一个新的。这就导致如果之前的Session没关联上,你拿到的是一个全新的空Session,getAttribute("username")返回null,后续如果直接用这个null值就会触发空指针。

建议改成req.getSession(false),这样如果没有已存在的Session就返回null,能提前发现问题:

HttpSession session = req.getSession(false);
if(session == null) {
    // 处理用户未登录的情况,比如返回错误提示
    Map<String, String> result = new HashMap<>();
    result.put("error", "请先登录");
    return result;
}
String loggedInUser = (String) session.getAttribute("username");
// 记得这里也要判断loggedInUser是否为null,避免后续操作空指针
if(loggedInUser == null) {
    // 处理Session存在但用户名未存入的情况
}

3. 验证登录逻辑是否真的执行了存Session的操作

有时候看起来代码写了,但实际没走到那一步:

  • 在登录方法里加个日志,比如System.out.println("已将用户名存入Session:" + un);,确认登录时确实执行了session.setAttribute("username", un)
  • 检查json.getString("username")有没有可能抛出异常?比如前端传的参数名是userName(首字母大写),而你写的是username,这样会触发JSON解析异常,try块里的存Session代码就不会执行。

4. 更简洁的Session属性获取方式(可选)

Spring MVC提供了@SessionAttribute注解,可以直接从Session里获取属性,不用手动操作HttpSession:

@Controller
public class ProfileController {
    @RequestMapping(value = "/getUserData", method = RequestMethod.GET, produces = "application/json")
    public @ResponseBody Map<String, String> getUser(
            @SessionAttribute(value = "username", required = false) String loggedInUser) throws Exception {
        if(loggedInUser == null) {
            Map<String, String> errorResult = new HashMap<>();
            errorResult.put("error", "用户未登录");
            return errorResult;
        }
        System.out.println("UserName is " + loggedInUser);
        // 构建返回数据
        Map<String, String> data = new HashMap<>();
        data.put("username", loggedInUser);
        return data;
    }
}

required=false表示如果Session里没有这个属性,不会抛出异常,而是返回null,方便你做后续处理。

按照上面的步骤排查,应该能找到空指针的根源并解决问题~

内容的提问来源于stack exchange,提问作者SHIVA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:59:21