同一上下文中的Servlet和JSF页面显示不同的会话

时间:2013-04-10 20:26:05

标签: servlets jsf-2

我们需要从发出请求的外部应用程序调用servlet。

servlet查看请求,执行一些处理并在请求或会话上设置属性,并重定向到JSF页面,该页面需要检索请求或会话上的属性集并执行其他操作。

对于这两种情况,我都无法检索会话中的属性/参数集或来自托管bean的请求,并且在进一步调试时,它显示会话ID在servlet和托管bean中是不同的。

由于这是来自外部应用程序的请求,因此servlet中没有会话,因此执行request.getSession(true);这是在servlet中创建一个新会话。

我的理解是,由于这些是同一个应用程序的一部分,并且使用相同的上下文,因此它们具有相同的会话。我的理解不正确吗? 这个问题有更好的解决方案吗? (我确实考虑过创建一个过滤器,但认为会话可能有同样的问题)

任何有助于更好地理解或解决此问题的帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

关于会议的工作方式,请仔细阅读:How do servlets work? Instantiation, sessions, shared variables and multithreading

实际上,外部应用程序应该发送与JSF应用程序正在使用的完全相同的会话cookie。另一种方法是提供一个包含jsessionid路径片段的回调URL,其组成如下:

String url = "http://example.com/context/servlet;jsessionid=" + session.getId();

另一种替代方法是生成一个唯一ID(带java.util.UUID)引用应用程序范围中的条目甚至DB,并将其设置为回调URL中的请求参数。您应该只在会话被销毁时手动清理它。您可以使用HTTP会话侦听器。