Java 为什么不是';t会话为空

Java 为什么不是';t会话为空,java,session,jakarta-ee,servlets,Java,Session,Jakarta Ee,Servlets,如果用户已经登录,我将使用以下代码将其发送到欢迎页面,如果用户没有登录,则返回到登录页面 HttpSession session = request.getSession(false); if(session == null){ request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); }else{ //User already l

如果用户已经登录,我将使用以下代码将其发送到欢迎页面,如果用户没有登录,则返回到登录页面

        HttpSession session = request.getSession(false);

    if(session == null){
        request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
    }else{
        //User already logged in. Send to home.
        response.sendRedirect("Welcome");
    }
第一次,它工作得很好,但是如果我重新加载页面,即使它将用户发送到欢迎页面,并且不可避免地向我返回一个500错误,因为该页面上的某些元素无法加载,因为用户登录代码尚未执行


即使重新加载页面时未声明request.getSession(true),会话是否也会自动启动?有没有办法防止这种情况发生?

会话可能是在转发到
login.jsp
时创建的。这是必要的,因为必须将用户分配给未经身份验证的请求,然后对其进行身份验证。如果要根据用户是否登录进行重定向,请使用
SessionContext
getCallerPrincipal


有关更多信息,请检查方法
请求。如果没有当前会话,getSession(false)
将返回null。我建议也比较一把钥匙

请看一下这条线


  • 我同意这一点。不要依赖季节的空值来查看用户是否登录。当用户登录时,设置一个属性(例如,
    session.setAttribute(“userId”,user.getId())
    ),并使用该属性查看用户是否登录。否则,如果您想使用JEE提供的内置安全机制,@PaoloVictor的解决方案更有意义。