JSP Session.getAttribute()方法返回null值

4

我不知道为什么我的session.getAttribute("user")在几分钟后返回非null值,但属性值返回null,这可能是由于会话超时,但为什么只有属性值返回null而其他会话仍然存在,即使session.getAttribute("user")返回非null值。

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

LoginServlet

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

我的个人资料

        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>

用户登录后,一切正常。但是几分钟后,“性别名称”将显示为空,而不是重定向到登录页面。我的余额和用户名会话仍然存在。在设置else user =(User)session.getAttribute(“user”)之前,我使用了...。
<jsp:useBean id="user" class="model.User" scope="session" />

1
我没有同样的问题。但是,我的问题类似。我在表单中设置了id属性(id =“name”)。我将此表单提交到一个servlet。servlet获取id并使用request.getParameter(“name”)获取参数。该参数被设置为会话属性。当我尝试最终使用JSP访问此属性时,我得到了null值。为什么? - david blaine
3个回答

2

我没有立即访问测试这个问题。但我猜测用户对象并没有在会话中被创建,因此它没有被设置为null

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

这应该可以解决你的问题。

编辑 另外,直接打印user.Gender()在这种情况下会返回null,所以最好直接从会话变量中打印。


你能告诉我为什么 JSP 中的 session.getAttribute("someId"); 可能会返回 null 吗?也就是说,当你遇到这个错误时,有哪些原因可能导致这个问题? - david blaine
通常的原因是会话已被无效化,可能是由于注销或超时。还有另一个可能原因,即在第一次设置会话时未设置 someid 对象。 - Vaishak Suresh
那么,我该如何修复这个问题?我尝试使用getSession(true),但失败了。我想我的代码都没问题。不知道为什么还是会得到null值。请也看一下下面的评论。谢谢。 - david blaine
我在一个表单中设置了id属性(id =“name”)。我将此表单提交到servlet。 Servlet获取ID并使用request.getParameter(“name”)获取参数。该参数被设置为会话属性。当我最终尝试在JSP内访问此属性时,我得到了一个null。为什么? - david blaine
1
我猜你只是设置了id属性,而没有设置name属性。如果不看代码,就不能说太多。要解决上述问题,您需要在尝试获取属性之前检查会话是否实际可用。如果不可用,将用户重定向到超时页面。 - Vaishak Suresh

2

我不知道为什么我的session.getAttribute("user")在几分钟后返回的是null,但属性值返回null。

好的,所以属性"user"变成了null。

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

咦?所以属性"user"不是null吗?

更改会话属性只有两种可能性:

  1. 如果您的会话超时:所有属性将同时被容器清除。
  2. 如果您的会话未超时,并且只清除了一个属性:则一个属性已被您的程序清除。

额外注意事项A:根据HttpServletResponse.sendRedirect的Java文档:使用此方法后,应该认为响应已提交并且不应再写入。您上面的代码违反了这一点。

额外注意事项B:

   User user = new User();

你刚刚使用了一个无用的、空的用户对象来填充它。请避免这种情况-这是一个潜在的bug。只有将变量设置为有用/有效的值才行。 :)

0

你在bean代码中使用了什么?你确定已经创建了一个空构造函数、getter和setter,并且Java类实现了Serializable接口吗?然后,在jsp页面上最好使用<jsp:setProperty name="the_same_you_used_in_bean_id" property="*"/>。如果你想要更多关于bean结构的信息,请告诉我!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接