我们需要从发出请求的外部应用程序调用servlet。
servlet查看请求,执行一些处理并在请求或会话上设置属性,并重定向到JSF页面,该页面需要检索请求或会话上的属性集并执行其他操作。
对于这两种情况,我都无法检索会话中的属性/参数集或来自托管bean的请求,并且在进一步调试时,它显示会话ID在servlet和托管bean中是不同的。
由于这是来自外部应用程序的请求,因此servlet中没有会话,因此执行request.getSession(true);这是在servlet中创建一个新会话。
我的理解是,由于这些是同一个应用程序的一部分,并且使用相同的上下文,因此它们具有相同的会话。我的理解不正确吗? 这个问题有更好的解决方案吗? (我确实考虑过创建一个过滤器,但认为会话可能有同样的问题)
任何有助于更好地理解或解决此问题的帮助都将受到赞赏。
答案 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会话侦听器。