【问题标题】:When is the JSESSIONID cookie added to the responseJSESSIONID cookie 何时添加到响应中
【发布时间】:2015-02-10 16:33:01
【问题描述】:

我有一个 JSF 2.0 应用程序,我们称之为“MyApp”,带有一个 SessionScoped bean,它使用以下代码获取会话并在初始化时设置路径...

HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();   //Get request from external context
HttpSession session = request.getSession(false);   //Get session and don't create one if it doesn't exist
session.getServletContext().getSessionCookieConfig().setPath(""); //Set the path in the session's cookie

我的问题是更新的路径 ("") 不会显示在响应会话 cookie JSESSIONID 中,直到对应用程序的第二次请求。第一个请求在响应中使用默认路径获取JSESSIONID cookie,其中包括应用程序的根上下文(“/MyApp”)。如果我重新加载页面,第二个请求将得到一个带有 JSESSIONID cookie 的响应,其中包含更新后的路径 ("")。

我似乎找不到任何关于何时创建默认 JSESSIONID cookie 并将其添加到响应中的文档。我不确定是否在第一个响应的 JSESSIONID cookie 中设置了更新的会话路径,或者它是否被页面的默认 JSESSIONID cookie 设置和覆盖。

问题:

  1. 默认 JSESSIONID cookie 何时添加到响应中?
  2. 是否可以禁止创建页面的默认 JSESSIONID cookie?

【问题讨论】:

    标签: jsf session cookies jsf-2 jsessionid


    【解决方案1】:

    默认的 JSESSIONID cookie 何时添加到响应中?

    第一次创建 HTTP 会话时。例如。当 JSF 需要在其中放置一个新创建的会话范围 bean 时。因此,如果您在这样的 bean 中编写一些应该操纵会话的代码,那么您基本上已经太迟了。

    您的代码 sn-p 也是一个强有力的证据。如果会话确实没有创建,那么request.getSession(false) 会返回null,随后调用session.getServletContext() 会抛出NullPointerException,而你会问一个非常不同的问题。


    是否可以禁止创建页面的默认 JSESSIONID cookie?

    我相信你问错了问题。您实际上想问如何正确设置会话cookie路径。

    您应该在web.xml 中配置会话cookie 路径,如下所示:

    <session-config>
        <cookie-config>
            <path>/</path>
        </cookie-config>
    </session-config>
    

    如果您真的打算以编程方式执行某些不清楚的原因(问题中未详细说明),那么您应该在第一次创建 HTTP 会话之前 执行此操作。换句话说,您绝对不应该在会话范围的 JSF 托管 bean 中执行此操作,也不应该从 HttpSession 本身获取所需的 ServletContext

    最明智的地方是servlet context listener,或者,如果你真的需要它是“JSF-ish”,那么就是一个急切初始化的应用程序范围的bean。请注意,这是应用程序范围设置,而不是会话范围设置。它是ServletContext(而不是HttpSession)的属性已经暗示了这一点。因此,一旦您设置它,它就会影响所有新创建的会话 cookie。 Depending on the concrete functional requirement which you told nothing about,可能有更好的方法。例如。一个额外的 cookie。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      • 2018-02-08
      • 2011-06-08
      • 2021-06-28
      • 2013-11-01
      • 2011-11-16
      相关资源
      最近更新 更多