1

我是这个论坛的新手。我正在设计一个 JSP-Servlet 应用程序并使用会话变量来存储对象。问题是,当我第二次访问会话变量时,它返回 null。这是我的应用程序的流程-

我有一个带有多个链接按钮的 jsp 页面。当用户单击任何按钮时,将使用相应的参数调用一个 servlet。例如,如果单击 button1,则传递 1,如果单击 button2,则传递 2,依此类推。

Servlet 从之前已经创建的会话变量中获取一个数组列表,并根据请求的参数从数组列表中获取数据,处理它并将响应发送到另一个 jsp 说 jsp2。

jsp2 也有类似的链接按钮,应该执行相同的任务。当从 jsp2 调用同一个 Servlet 时,或者即使页面被刷新,这次 session 变量为 null。

在 session-config 标记下的 web.xml 文件中,我将超时设置为 -1,以便会话永不过期。

<session-config>
      <session-timeout>-1</session-timeout> 
   </session-config>

在 servlet 中,我将会话变量作为 -

HttpSession session = request.getSession(false);

ArrayList<String> list = new ArrayList<String>();
list = (ArrayList<String>)session.getAttribute("mylist");

当第二次调用 servlet 时,或者即使页面被刷新,列表也为空。我放了几行来检查会话是否有效 - 它第二次打印。

if(!request.isRequestedSessionIdValid()) {
 System.out.println("Session is Expired !!");
}

session.getAttribute("mylist")回报NullPointerException

我确信我没有session.invalidate()偶然使用任何地方来结束会话。我不明白出了什么问题..有人可以解释一下吗?

提前谢谢了。

4

4 回答 4

2

您需要getSession(true)第一次尝试使用 或getSession(). 如果会话不存在,则 False 参数将不会返回会话。只有第一次您需要在getSession通话中提供真实信息。

HttpSession session = request.getSession(true);

根据 servlet 规范,

HttpSession getSession(布尔创建)

返回与此请求关联的当前 HttpSession,或者,如果没有当前会话并且 create 为 true,则返回一个新会话。

如果 create 为 false 并且请求没有有效的 HttpSession,则此方法返回 null。

为确保正确维护会话,您必须在提交响应之前调用此方法。如果容器正在使用 cookie 来维护会话完整性,并且在提交响应时被要求创建新会话,则会引发 IllegalStateException。

编辑 - 来自会话 ID 的会话

 HttpSessionContext sc=request.getSession().getSessionContext();
    HttpSession session=sc.getSession(session_id);

注意 - 由于安全原因,现在不推荐使用此方法。

于 2012-10-18T15:33:42.640 回答
1

尝试将响应发送到其他一些 jsp 页面,看看您是否能够从那里访问会话变量。如果是,那么您当前的 jsp 中存在问题。当然,会话肯定会在某处过期,否则 request.getSession() 肯定会返回先前创建的会话。

于 2012-10-18T18:19:49.517 回答
0

将 timeout 设置为0,而不是-1如果您想要无限的会话时间。

于 2012-10-18T14:29:48.563 回答
0

您需要在某处设置属性,然后才能检索它:

session.setAttribute("mylist", list);
于 2012-10-18T14:33:42.277 回答