【问题标题】:JSession cookie dropping cause DuplicateSessionDetected exception when use https rather http使用 https 而不是 http 时,JSession cookie 丢弃导致 DuplicateSessionDetected 异常
【发布时间】:2014-02-23 11:03:01
【问题描述】:

我开发 Grails+BlazeDS 服务器和 Flex AIR 客户端并遇到此错误: 检测到重复的基于 HTTP 的 FlexSession,通常是由于远程主机禁用了会话 cookie。必须启用会话 cookie 才能正确管理客户端连接

Google 搜索没有成功,因为我发现情况有所不同。 我只有在 Flex 客户端通过 https 与服务器交互时遇到的问题。

Flex 客户端:

<s:ChannelSet id="userChannel">
           <s:SecureAMFChannel uri="https://localhost:8443/Con/messagebroker/amfpolling" />
</s:ChannelSet> 

UI 中的按钮点击触发登录方法:

loginResult.token = channelSet.login(usernameInput.text, passwordInput.text);

并以 DuplicateSessionDetected 异常结束。 :(

在调查网络监视器日志后,我发现从服务器收到的 jsession cookie 未在对服务器的下一个请求中设置:

来自服务器的响应(操作:client_ping)

    HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=F58F1ADA97E70915EF9E6E4EE1AEBE00; Path=/; Secure
Content-Type: application/x-amf
Content-Length: 173
Date: Sun, 23 Feb 2014 10:17:00 GMT

Flex Message (flex.messaging.messages.AcknowledgeMessageExt)     clientId = EA18E8B9-951F-6F87-7B47-48B8B202EE75    correlationId = 7D2782C1-C8A5-41A3-2055-5E3F771424C8    destination = null    messageId = EA18E8F6-9E0E-1FE4-0D26-6F0E602F5C5E    timestamp = 1393150620542    timeToLive = 0    body = null    hdr(DSMessagingVersion) = 1.0    hdr(DSId) = EA18E8B9-950B-4B42-EF70-369D656BA3F2

下一个对服务器的请求(登录操作)没有 jsession cookie:

POST /Conn/messagebroker/amfsecure HTTP/1.1
Referer: app:/BlazeDSClient.swf
Accept: text/xml, application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8, text/css, image/png, image/jpeg, image/gif;q=0.8, application/x-shockwave-flash, video/mp4;q=0.9, flv-application/octet-stream;q=0.8, video/x-flv;q=0.7, audio/mp4, application/futuresplash, */*;q=0.5
x-flash-version: 12,0,0,68
Content-Type: application/x-amf
Accept-Encoding: gzip,deflate
User-Agent: Mozilla/5.0 (Windows; U; en) AppleWebKit/533.19.4 (KHTML, like Gecko) AdobeAIR/4.0
Host: localhost
Content-Length: 299

Flex Message (flex.messaging.messages.CommandMessage)     operation = login    clientId =  null    destination =  auth    messageId =  7B47BBF2-08C0-0E41-5D88-5E3F76FA4882    timestamp =  0    timeToLive =  0    ***not printing credentials***

服务器使用新的会话 cookie 应答:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=03BD8347F9E9511C299B717DD55625C9; Path=/; Secure
Content-Type: application/x-amf
Content-Length: 535
Date: Sun, 23 Feb 2014 10:17:01 GMT

Flex Message (flex.messaging.messages.ErrorMessage)     clientId = null    correlationId = 7B47BBF2-08C0-0E41-5D88-5E3F76FA4882    destination = auth    messageId = EA18F4A7-C80D-103B-F8D0-58B6F148F142    timestamp = 1393150621768    timeToLive = 0    body = null    code =  Server.Processing.DuplicateSessionDetected    message =  Detected duplicate HTTP-based FlexSessions, generally due to the remote host disabling session cookies. Session cookies must be enabled to manage the client connection correctly.    details =  null    rootCause =  null    body =  null    extendedData =  null

再一次 - 当使用非安全协议时一切正常 - 会话 cookie 按预期在登录操作中发送到服务器。

我在Flex开发方面有一点经验,在触发频道登录请求时没有找到任何设置会话cookie的方法。你能帮忙解决这个问题吗?

谢谢!

【问题讨论】:

  • 嗨,我遇到了一个类似的问题,即请求中的 HTTPS 中删除的 cookie (JsessionId)。但是我已经自定义了 Flash 并且没有使用 Flash builder 的网络监视器工具。你知道可能出了什么问题吗?感谢您的评论和帮助。谢谢

标签: apache-flex https blazeds sessionid


【解决方案1】:

明白了!!

难以置信,但 DuplicateSessionDetected 异常的原因是 Flash Builder 的网络监视器工具。关闭后没有任何异常发生。我认为当 Monitor 与安全协议一起使用时充当代理时会出现问题。

【讨论】:

    【解决方案2】:

    当然,这个问题已经死了,但是在这方面我有话要对未来的读者说。

    Flash Player(包括 Flex)不会在请求中传输默认的 JSESSIONID,除非您在 JSESSIONID cookie 中设置 SameSite=None,否则无法传输。

    我遇到了将 JSESSIONID cookie 丢弃在请求中的问题,我发现这是因为现代浏览器(chrome > 80)不允许 Flash/Flex 播放器访问 JSESSIONID cookie,而 cookie 不允许有 SameSite=NoneSecure 闪存。

    请阅读 Adob​​e here 的公告 详细了解新的 cookie 政策:

    1. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
    2. https://medium.com/adobetech/adobe-experience-cloud-cookie-updates-for-google-chrome-19ad67cf1598
    3. https://digiday.com/media/what-is-chrome-samesite/

    【讨论】:

      【解决方案3】:

      不要执行 client_ping 操作,然后尝试安全通道设置。通过 ping 服务器,您正在创建另一个通道集(默认情况下,flash 会为您创建一个),然后您尝试使用 .login 操作打开另一个通道集。通过重新启动服务器(新实例)来尝试此操作,否则您将创建更多会话。

      【讨论】:

      • 宙斯,感谢您的回答。 Flex 中是否有任何设置可以防止发送 client_ping,因为我没有在代码中触发此请求。我只是调用 login() 和 Flex 生成这些序列 -> client_ping,login.
      • 我猜,在您的代码中某处您正在使用 Blazeds Consumer 订阅。您能否验证您的应用程序在登录前是否没有调用“消费者”?并且没有声明多个“Channelset”?
      • 是的,有消费者在登录后订阅,但在删除此代码并将其简化为只有登录操作后,它仍然返回异常。顺便说一句,当使用 http 相当安全的协议时,它是有效的。
      • 如果要选择通道集,您可以将代码发布到您正在执行的位置吗?尝试使用 AS 通道集而不是使用 mxml。像 var ch:ChannelSet = new ChannelSet();等等,
      • 我从 mxml 中删除所有频道定义并在代码中初始化它们:' private var channels:ChannelSet;私有变量secureChannel:SecureAMFChannel;受保护的函数 loginButton_clickHandler(event:MouseEvent):void { channels =new ChannelSet();安全通道=新的 SecureAMFChannel(); secureChannel.url="localhost:8443/Con/messagebroker/amfsecure";频道.addChannel(secureChannel); loginResult.token = channels.login(usernameInput.text, passwordInput.text); Alert.show(loginResult.token.message.toString()); }'
      猜你喜欢
      • 1970-01-01
      • 2019-01-30
      • 2010-10-21
      • 1970-01-01
      • 2012-12-28
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多