我是这个论坛的新手。我正在设计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()
来结束会话。
我不明白出了什么问题。有人可以解释一下吗?
非常感谢提前。
答案 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);