2015-02-10 17 views
2

我有一个JSF 2.0应用程序,我们称之为“MyApp”,使用SessionScoped bean,使用下面的代码获取会话并在init上设置路径...什么时候JSESSIONID cookie添加到响应

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中,直到对应用程序发出第二个请求。第一个请求在包含应用程序的根上下文(“/ MyApp”)的默认路径的响应中获得一个JSESSIONID Cookie。如果我重新加载页面,此第二个请求将得到一个包含更新路径(“”)的cookie(JSESSIONID)的响应。

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

问题:

  1. 什么时候默认JSESSIONID的cookie被添加到反应?
  2. 是否可以禁用创建页面的默认JSESSIONID cookie?

回答

5

什么时候默认JSESSIONID的cookie被添加到反应?

当HTTP会话第一次被创建时。例如。当JSF需要将新创建的会话作用域bean放在那里时。所以如果你在这样一个应该操纵会话的bean中编写代码,那么你基本上已经太晚了。

你的代码片段也是一个很好的证据。如果会话确实没有创建,那么request.getSession(false)将返回null,随后,调用session.getServletContext()会抛出NullPointerException,并且您会问一个非常不同的问题。


是否有可能被禁止创建页面的默认JSESSIONID饼干吗?

我相信你问的是错误的问题。您实际上想要问如何以正确的方式设置会话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。

相关问题