1

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

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

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

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

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

任何有助于更好地理解或解决此问题的帮助将不胜感激。

4

1 回答 1

0

至于会话是如何工作的,请仔细阅读:servlet 是如何工作的?实例化、会话、共享变量和多线程

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

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

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

于 2013-04-10T20:48:03.803 回答