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

Logout类报错Cannot invoke HttpSession.getAttribute因session为null求排查建议

错误分析与修复建议

错误根源

你调用request.getSession(false)时,如果当前不存在有效会话,这个方法会返回null。而你直接在if条件里调用session.getAttribute("userCategory"),此时session为null就会触发空指针异常,也就是你看到的Cannot invoke "javax.servlet.http.HttpSession.getAttribute(String)" because "session" is null错误。

修复步骤

  1. 先判断session是否存在:在调用session的任何方法前,必须先检查session不为null
  2. 简化会话销毁逻辑:session.invalidate()会直接销毁整个会话,无需手动逐个移除属性
  3. 补充无会话场景处理:当session不存在或属性不全时,直接重定向到首页即可

修复后的代码示例:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    Servlet.setContentType(request, response);
    
    try {
        HttpSession session = request.getSession(false);
        // 先校验session是否存在,再检查会话属性
        if (session != null 
            && session.getAttribute("userCategory") != null 
            && session.getAttribute("userId") != null
            && session.getAttribute("userName") != null) {

            // 直接销毁会话,无需手动移除属性
            session.invalidate();

            // 设置缓存控制头,防止后退按钮访问缓存页面
            response.setHeader("Cache-Control", "private, no-store, no-cache, must-revalidate");
            response.setHeader("Pragma", "no-cache");
            response.setDateHeader("Expires", 0);

            // 重定向到首页
            response.sendRedirect("/");
            return;
        }
        // session不存在或属性不全时,直接跳转首页
        response.sendRedirect("/");
        
    } catch (Exception e) {
        EmailErrorsToAdmin.setMsg(this.getClass().getCanonicalName(), e);
    }
}

额外提示

  • request.getSession(false)和request.getSession()的区别:前者不会创建新会话,后者如果没有会话会自动创建,注销场景必须用前者
  • 确保return语句生效,避免后续代码意外执行(你的原代码里已经加了return,这点没问题)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:05:00