会话范围和 jsf 重定向

Posted

技术标签:

【中文标题】会话范围和 jsf 重定向【英文标题】:Conversation scoped and jsf redirect 【发布时间】:2013-03-28 09:54:43 【问题描述】:

是否可以在重定向到外部 url 期间保持对话? 我开始使用 CDI 对话 bean 进行贝宝交易,接下来当我登录并进行支付时,面孔重定向到贝宝页面,下一个贝宝返回我的页面,我希望拥有我的支持 bean 的相同实例来记住我发送到的详细信息贝宝。

当 paypal 重定向回我的页面时,他会附加到 url 交易令牌和付款人 ID,但我没有关于用户购买的产品数量的任何信息。所以我想记住重定向之前的数量。现在,在贝宝返回我的网站后,我调用方法 doExpressCheckout 并且我想传递数量和其他交易详细信息,因为我可以设置与交易前完全不同的详细信息,并且当客户在贝宝页面上接受购买某些产品时可能会出现奇怪的情况10 美元,但我在贝宝再次重定向到我的页面后设置了 100 美元,客户将不知道他支付了多少。 我不知道为什么会这样。

我使用 SOAP api。

【问题讨论】:

看起来您应该从会话范围更改为会话范围。 @LuiggiMendoza,我不确定它是如何工作的,但感觉贝宝可能没有义务返回带有 JSESSION_ID 的进程。浏览器会在来自外部站点的重定向中自动重新添加它吗? @kolossus 如果将会话保存在服务器中,为什么需要将 JSESSION_ID 作为请求查询字符串的一部分? @LuiggiMendoza 如果 JSESSION_ID 不存在于 paypal 的返回请求中,服务器将如何识别来自 paypal 的返回请求并将其与保存的会话匹配? @kolossus 如果客户端浏览器仍然打开,即使您离开站点并稍后返回,会话也不会终止(当然,假设用户仍在会话超时内)。顺便说一句,JSESSION_ID 可以存储在 cookie 中(或使用其他机制)。 【参考方案1】:

是的,您可以通过外部重定向恢复对话。只需在您传递给 PayPal 的返回 URL 中包含cid=nnn。例如:

returnUrl = "http://myip/myapp/return.seam?cid=" + Conversation.instance().getId();
details.setReturnURL(returnUrl);
...

由于默认的 2 分钟会话超时相当有限,您最终会希望在调用 PayPal 之前增加会话超时:

Conversation.instance().setTimeout(900000); // 15 minutes

但是,这样做不一定是一个好主意,因为它可能会长时间保留数据,并且您还需要保留会话 cookie 才能使该方案正常工作(因此,如果必要)。

更好的策略是永久保存交易数据(数据库或磁盘),将随机生成的 ID 与数据相关联,并在从 PayPal 返回时检索它。这样您就无需将对话保存在内存中。

【讨论】:

【参考方案2】:

当贝宝重定向回我的页面时,他会附加到 url 交易 令牌和付款人 ID,但我没有关于数量的任何信息 用户购买的产品。

您可以将预对话 id 附加到您传递给 Paypal 的 url 作为返回 url。这样对话 id 将与上述参数一起传回,seam 将知道用所有数据恢复预付款对话。

【讨论】:

以上是关于会话范围和 jsf 重定向的主要内容,如果未能解决你的问题,请参考以下文章

JSF过滤器在初始重定向后不重定向[关闭]

JSF AJAX和正常重定向登录并返回上一页

JSF 中的 ViewExpiredException [重复]

链接中的 URL 片段和 JSF 中的 ajax 重定向

将 PrimeFaces 与 JSF 一起使用时 Shiro 重定向到错误的位置

重定向后 Flash 范围内的对象不可用