我不知道为什么几分钟后我的session.getAttribute(“ user”)返回不为null但属性值重新调整为null,这可能是由于会话超时导致的,但是为什么只有属性值返回null但其他会话仍然存在,即使session.getAttribute (“用户”)返回的结果不为null。

这是我的网页流程,用户登录。

LoginServlet
/>我的个人资料

User s = new User();
s.retriveuser();
session.setAttribute("balance", s.getBalance());
session.setAttribute("username", s.getUsername());
session.setAttribute("user", s);


用户登录后一切正常,它可以显示,几分钟后,性别名称将显示为null,而不是重定向到登录页面。而且我的余额和用户名会话仍然存在。
在设置其他用户之前= user(user)session.getAttribute(“ user”);我正在使用

        User user = new User();
        if (session.getAttribute("user") == null) {
            response.sendRedirect("login.jsp");
        } else {
            user = (model.User) session.getAttribute("user");
        }

 <tr>
         <th>Gender:</th>
              <td><%=user.getGender()%></td>
 </tr>
 <tr>
         <th>Name:</th>
         <td><%=user.getName()%></td>
 </tr>


评论

我没有同样的问题。但是,我的问题是相似的。我以一种形式设置id属性(id =“ name”)。我将此表单提交到servlet。小服务程序获取id并使用request.getParameter(“ name”)获取参数。该参数设置为会话属性。当我尝试使用JSP最终访问此属性时,我得到一个空值。为什么?

#1 楼


我不知道为什么我的session.getAttribute(“ user”)返回不为null,而是属性值在几分钟后重新调整为null

可能是由于会话超时导致的,但是为什么只有属性值返回null但其他会话仍然存在,即使session.getAttribute(“ user”)也不返回null。

队列?因此属性“用户”不为空吗?

只有两种可能性更改会话属性:
如果您的会话没有超时,并且只清除了一个属性:您的程序清除了一个属性。

附加说明A:来自javadoc对于HttpServletResponse.sendRedirect:使用此方法后,应将响应视为已提交且不应写入。上面的代码违反了此规则。避免这种情况-这是一个等待发生的错误。仅将变量设置为有用/有效值。
:)

#2 楼

我没有机会进行测试。但是我猜想q4​​312079q对象不是在会话中创建的,因此它不会设置为user
if (session.getAttribute("user") == null) {
    response.sendRedirect("login.jsp");
    user = null;
} else {
    user = (model.User) session.getAttribute("user");
}

应该可以解决您的问题。
编辑同样,只需打印null即可返回user.Gender()在这种情况下,最好还是直接从会话变量中进行打印。

评论


你能告诉我为什么session.getAttribute(“ someId”);在JSP中可能返回null?也就是说,当您收到此错误时,导致此问题的原因列表是什么?

–大卫·布莱恩
2013年6月17日在22:59



原因通常是由于注销或超时使会话无效。可能还有另一个原因,并且不是在会话中首先设置了someid对象。

–Vaishak Suresh
2013年6月17日23:06

那么,我该如何解决呢?我尝试使用getSession(true),但失败了。我想我所有的代码都很好。不知道为什么我仍然得到那个空值。另请参阅下面的评论。谢谢。

–大卫·布莱恩
2013年6月17日23:11

我以一种形式设置id属性(id =“ name”)。我将此表单提交到servlet。小服务程序获取id并使用request.getParameter(“ name”)获取参数。该参数设置为会话属性。当我尝试最终在JSP中访问此属性时,我得到一个空值。为什么呢

–大卫·布莱恩
2013年6月17日23:12



我猜您只是在设置id属性,而不是name属性。不看代码就不能说太多。要解决上述问题,您需要在尝试获取属性之前检查会话是否实际可用。如果不是,则将用户重定向到超时页面。

–Vaishak Suresh
2013年6月17日23:37

#3 楼

您在bean代码内部使用了什么?确定要为java类实现Serializable创建一个空的构造函数,getters,setters,然后在jsp页面上最好使用<jsp:setProperty name="the_same_you_used_in_bean_id" property="*"/>。如果您需要有关bean结构的更多信息,请告诉我!