【问题标题】:Fetching old session value even if session is destroyed即使会话被销毁,也能获取旧会话值
【发布时间】:2026-01-23 17:45:02
【问题描述】:
 @Override
   public void sessionDestroyed(HttpSessionEvent arg0)
   {
      boolean isRemoved = sessionIdSet.remove(arg0.getSession().getId());
      if (isRemoved)
      {
          arg0.getSession().invalidate();
          System.out.println(arg0.getSession().getAttribute("userName"));
          System.out.println("session destroyed");
      }
   }

假设登录时属性 userNametestUser。因此,在我的 java 控制台超时后,我得到了 null and session destroyed 打印。因此,如果它为 null,这意味着当我关注我的 jsp 时,我应该得到 null 但我仍然得到 testUser >

 $("body").click(function(event){
            var property="<%=session.getAttribute("userName")%>";
            //Here I expect property to be null as session is destroyed 
                //and it prints null in java so it should also here.
            alert(property);
            //But what i get here is testUser
    }

使用 Spring 拦截器

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException {

        boolean allowRequest = true;
        String requestUri = request.getRequestURI().toString();
        HttpSession session = request.getSession(false);
        logger.info("Pre-intercepting request URI: " + requestUri);
        try {
        if(null != session) {
            String sessionBelongsTo = (String) session.getAttribute("CUR_TYPE");
            String user = (String) session.getAttribute("userName");
            System.out.println(user);

            if(!requestUri.endsWith("/login") && !requestUri.endsWith("/loginauth") && !requestUri.endsWith("sap-ui-core.js") && !requestUri.endsWith("/main")) {
                    if(null == user) {
                        logger.info(""
                                + "Login required, redirecting to LOGIN page");
                          response.sendRedirect(request.getContextPath() + "/login");
                          allowRequest = false;
                    }
                    else {
                        logger.info("Login not required");
                        }
                }
            }
        else{
            logger.debug("session is null.redirecting to login");
            session = request.getSession();
            response.sendRedirect(request.getContextPath() + "/login");
            allowRequest = false;
        }
        }catch(IOException ioe) {
            logger.info(ioe.getMessage());
            allowRequest = false;
        }
          return allowRequest;
        }

使用拦截器进行重定向调用 GET http://localhost:9090/app/login 成功,但重定向从未真正发生。

【问题讨论】:

    标签: java jsp spring-mvc servlets


    【解决方案1】:

    您正在混合两种不同的代码。您必须意识到,wherewhen 每个代码被执行 - 当页面被请求和呈现时(即 before 响应时服务器上的 JSP发送到浏览器)和浏览器中的Javascript,浏览器收到已经生成的响应。

    &lt;%=session.getAttribute("userName")%&gt; 在服务器上处理,您的浏览器接收例如var property="johndoe"; - 当您的 onclick 处理程序被执行时,JSP 代码不会再次执行。

    【讨论】:

    • 所以在这种情况下,我想在超时时将我的页面重定向到登录页面,因此 HttpServletResponse 在 sessionDestroyed 方法中不起作用,所以我无法从那里执行 response.sendRedirect 并且我无法从 jsp 中的会话中获取最新值也有任何替代方法可以实现这一目标
    • Google for ajax session timeout