我有一个Flex应用程序,它通过JSP页面提供。在此页面中,我在加载页面时使用HttpSession输出会话ID:
System.out.println("Session ID: " + session.getId());
在BlazeDS中托管的一个非常简单的远程对象(使用AMF通道和标准RemoteObject功能从flex应用程序调用)中,我还输出了会话ID,但这次使用的是FlexSession(据我所知,它应该包围HttpSession)
System.out.println("FlexSession ID: " + FlexContext.getFlexSession().getId());
我希望两个ID都相同,但事实并非如此。会话ID不同导致问题,因为HttpSession中存储了我需要能够从BlazeDS中的远程对象访问的数据。
我已经用尽了BlazeDS和FlexClient / FlexSession / FlexContext上的阅读材料,但无法理解为什么FlexSession没有链接到HttpSession。任何指针都非常感激。
我觉得我必须在这里遗漏一些有趣的东西,我是否正在访问
答案 0 :(得分:3)
我不认为它与FlashPlayer有关..它与FlexSession的概念以及BlazeDS / LCDS的工作原理更相关。例如,即使不使用http通道,您也可以拥有活动会话 - 使用NIO / RTMP时,您将绕过应用程序服务器和http协议。因此,有一个具有各种实现的抽象类FlexSession是有意义的。
然而,当使用BlazeDS时,FlexSession将在内部包装HttpSession对象,而removeAttribute / getAttribute / setAttribute实际上是从HttpSession对象调用相同的方法。因此您可以从HttpSession访问所有数据。如果没有,请提供更多详细信息。
但是,在使用RTMP通道时(在顺便说一下只存在于LCDS中)它不起作用,在这种情况下需要更改设计。
答案 1 :(得分:2)
感谢上面的两个答案,我终于找到了根本原因,并认为我会在这里分享。
会话ID不同的原因与使用SSL进行身份验证和使用AMF Channel而不是Secure AMF有关。首次使用该通道会导致创建一个新会话(因此不同的ID)作为与该站点的安全版本相关的现有会话。
愚蠢的配置错误,但值得传递 - 确保如果使用SSL,您也使用安全AMF连接到安全端点而不是标准AMF,否则您将遇到我遇到的相同会话ID问题。
答案 2 :(得分:1)
不幸的是,这就是Flash播放器的工作原理。我多次见过这种行为。
我找到的最佳解决方案是建立HTTP会话并传回会话ID。在客户端,您可以将会话ID传递给Flex应用程序。然后,您将该ID从Flash发送到服务器,并使用它来查找现有会话或建立第二个会话。
虽然你需要做这样的事情,但我还是找不到可靠的方法让Flash使用同一个会话。