Auth Session Servlet代码异常:为何始终进入ELSE分支?
排查Auth Session Servlet始终进入ELSE分支的问题
看起来你的代码里判断session == null但总是进入else分支,这说明当前请求始终存在HttpSession对象,哪怕你觉得应该是未登录状态。我帮你梳理几个最可能的原因和解决办法:
首先先把你的代码贴出来方便分析:
if (session == null) { request.setAttribute("stts_log", "Login"); request.setAttribute("btn_modal", "exambutton"); request.setAttribute("btn_href", "#"); out.print("Please login first"); RequestDispatcher rd=request.getRequestDispatcher("index2.jsp"); rd.forward(request, response); } else { request.setAttribute("sess", session); request.setAttribute("stts_log", "Logout"); request.setAttribute("btn_modal", ""); request.setAttribute("btn_href", "ControllerServlet"); RequestDispatcher rd=request.getRequestDispatcher("index2.jsp"); rd.forward(request, response); }
最可能的核心问题:错误的Session获取方式
你获取session变量的方式大概率是用了request.getSession()(不带参数)——这个方法的行为是:如果当前没有会话,就自动创建一个新的会话,所以它永远不会返回null!
正确的做法是使用request.getSession(false),这个方法只会返回当前已存在的会话,如果没有会话存在就返回null,完全符合你判断未登录场景的需求。
修正后的代码开头应该是:
HttpSession session = request.getSession(false); // 关键修正 if (session == null) { // 未登录逻辑 } else { // 已登录逻辑 }
其他可能的原因
- 浏览器/容器自动创建会话:Servlet容器默认会在第一次请求时自动创建会话,哪怕你没显式调用
getSession()。如果你的请求链路中(比如前置过滤器、其他Servlet)有地方触发了会话创建,那到这个Servlet时session已经存在了。 - JSP页面默认开启会话:如果你的请求先经过某个JSP页面,JSP默认会自动创建会话(除非在页面顶部添加
<%@ page session="false" %>指令禁用),这也会导致后续Servlet中session不为null。
排查小技巧
可以在判断session之前加一行打印,看看session的状态:
HttpSession session = request.getSession(false); System.out.println("Session ID: " + (session != null ? session.getId() : "null"));
如果打印出的Session ID每次请求都一样,说明是同一个会话被保留了;如果每次都是新的ID但不为null,那肯定是某个地方自动创建了会话。
内容的提问来源于stack exchange,提问作者Cece Syamsul Hadi
相关产品推荐
相关产品推荐

