我有一个JSF 2.0应用程序,让我们用#{1}} bean调用它" MyApp",使用下面的代码来获取会话并在init上设置路径。 ..
SessionScoped
我的问题是更新的路径("")在响应会话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
中没有显示,直到第二次请求到应用程序。第一个请求在响应中使用默认路径获取JSESSIONID
cookie,其中包括应用程序的根上下文(" / MyApp")。如果我重新加载页面,第二个请求将获得一个包含更新路径的JSESSIONID
cookie的响应("")。
我似乎无法找到有关何时创建默认JSESSIONID
Cookie并将其添加到响应中的任何文档。我不确定是否在第一个回复的JSESSIONID
Cookie中设置了更新的会话路径,或者是否正在设置并覆盖该页面的默认{{{} {{{{ 1}} cookie。
问题:
答案 0 :(得分:6)
何时将默认的JSESSIONID cookie添加到响应中?
第一次创建HTTP会话时。例如。当JSF需要在那里放置一个新创建的会话范围bean。因此,如果你在这样一个应该操纵会话的bean中编写一些代码,那么你基本上已经太晚了。
您的代码段也是它的有力证据。如果真的没有创建会话,那么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中执行此操作,也不应从ServletContext
本身获取所需的HttpSession
。
最明智的地方是servlet context listener,或者,如果你真的需要它是“JSF-ish”,那么一个急切初始化的应用程序作用域bean。请注意,这是应用程序范围设置,而不是会话范围的设置。它是ServletContext
(而不是HttpSession
)的属性已经暗示了这一点。因此,一旦设置它,它将影响所有新创建的会话cookie。 Depending on the concrete functional requirement which you told nothing about,可能有更好的方法。例如。一个额外的cookie。