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错误。
修复步骤
- 先判断session是否存在:在调用session的任何方法前,必须先检查session不为null
- 简化会话销毁逻辑:
session.invalidate()会直接销毁整个会话,无需手动逐个移除属性 - 补充无会话场景处理:当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
相关产品推荐
相关产品推荐

