第二次访问时,会话变量为空

时间:2012-10-18 14:28:12

标签: java jsp session servlets

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

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

Servlet从会话变量中获取一个arraylist,它已经是先前创建的,并且根据请求的参数从arraylist获取数据,处理它并将响应发送给另一个jsp,例如jsp2。

jsp2也有类似的链接按钮,应该执行相同的任务。当从jsp2调用相同的Servlet时,或者即使页面被刷新,这次会话变量为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时,或者即使刷新页面,列表也为null。 我用几行来检查会话是否有效 - 并且它第二次打印。

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

session.getAttribute("mylist")返回NullPointerException

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

非常感谢提前。

4 个答案:

答案 0 :(得分:2)

您需要首次使用getSession(true)getSession()。 如果会话不存在,则假参数不会返回会话。只有在您第一次需要向getSession电话提供真实情况时。

HttpSession session = request.getSession(true);

根据servlet规范,

  

HttpSession getSession(boolean create)

     

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

     

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

     

要确保正确维护会话,必须在提交响应之前调用此方法。如果容器是   使用cookie来维护会话完整性并被要求创建一个   提交响应时的新会话,IllegalStateException   扔了。

编辑 - 会话ID会话

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

注意 - 由于安全原因,此方法现已弃用。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

session.setAttribute("mylist", list);