【问题标题】:Session variable is null when accessed second time第二次访问时会话变量为空
【发布时间】:2012-10-18 14:28:11
【问题描述】:

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

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

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

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

在我的 web.xml 文件中的 session-config 标记下,我将超时设置为 -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() 来结束会话。 我不明白出了什么问题..有人可以解释一下吗?

非常感谢。

【问题讨论】:

    标签: java jsp session servlets


    【解决方案1】:

    您需要第一次尝试使用getSession(true)getSession()。 如果会话不存在,则 False 参数将不会返回会话。只有第一次您需要为getSession 调用提供true。

    HttpSession session = request.getSession(true);
    

    根据servlet规范,

    HttpSession getSession(boolean create)

    返回与此请求关联的当前 HttpSession,或者,如果没有 当前会话和创建为真,返回一个新的 会话。

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

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

    编辑 - 来自会话 ID 的会话

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

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

    【讨论】:

    • 但是为什么它无法获取我之前的会话?有没有办法让请求使用其会话 ID 来引用特定会话?
    • 特定会话是什么意思?如果您之前有过会话(和/或仅当您之前创建过会话),您应该使用 getSession(false) 获取它。但是怎么知道是第一次还是第二次呢?
    • 在我的情况下,如果第二次调用 Servlet,request.getSession(false) 不会返回先前创建的会话。如果我使用 request.getSession(true),它会创建一个新会话。我用 sessionId 弄清楚了..所以我的意思是说如果我知道以前创建的会话的 sessionId 我如何使用 sessionId 获得它?
    • 在 servlet 2.2 之前有一个使用 sessionid 查找会话的选项。由于安全原因,此方法已被弃用。顺便说一句,如果你有会话(如果它没有过期),你应该使用 getSession()。如果你得到空值,这意味着会话已过期。
    【解决方案2】:

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

    【讨论】:

    • 你是对的,伙计。我能够从其他 jsp 访问会话变量,并且会话实际上在我之前的 jsp 页面中包含的 index.jsp 中被破坏了。非常感谢你!
    【解决方案3】:

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

    【讨论】:

    • 能否解释一下,属性是空还是会话对象?
    • session.getAttribute("mylist") 返回 NullPointerException
    【解决方案4】:

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

    session.setAttribute("mylist", list);
    

    【讨论】:

    • 我的问题是第二次访问时列表(会话变量)为空。在我检索它之前,该列表已经设置在某个地方。
    • 好吧,当list 为空时,这并不奇怪。
    • 那是因为你在会话的属性中存储了空值。向我们展示一段代码,您在哪里添加此属性。
    • 很抱歉 session.getAttribute("mylist") 返回 NullPointerException
    • 你在哪里创建会话? request.getSession(false) 不会这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多