apache-flex - 检测到重复的基于 HTTP 的 FlexSession,通常是由于远程主机禁用了 session cookie

标签 apache-flex session jms blazeds consumer

场景描述:
我的程序是通过flex+java+blazeDS+activeMQ实现的,它通过Flex Consumer从activeMQ订阅jms消息,目前我交付了两个tomcat
同一个服务器,它们都包含我的程序,而 ActiveMQ 在另一台服务器上,现在我在同一种浏览器中打开这两个应用程序,例如
作为 IE 或 Chrome,无论如何,url 就像 http://localhost: 8080 /HelloWord/index.html, http://localhost: 8181 /HelloWord/index.html

问题:
第一个应用程序 url 是 http://localhost: 8080 /HelloWord/index.html,我用ie打开,可以很好的订阅消息,但是当我打开第二个的时候
url 为 http://localhost: 的第二个应用程序8181 /HelloWord/index.html 在ie中,发生意外,两个应用程序无法订阅消息。

错误日志:
1.flex 客户端日志(flash.log):
检测到重复的基于 HTTP 的 FlexSession,通常是由于远程主机禁用了 session cookie。必须启用 session cookie 才能正确管理客户端连接
2.java控制台日志:
flex.messaging.client.FlexClientNotSubscribedException:客户端在端点“my-polling-amf”上没有事件订阅。
在 flex.messaging.client.FlexClient.throwNotSubscribedException(FlexClient.java:1789)
在 flex.messaging.client.FlexClient.pollWithWait(FlexClient.java:967)
在 flex.messaging.endpoints.BasePollingHTTPEndpoint.handleFlexClientPoll(BasePollingHTTPEndpoint.java:538)
在 flex.messaging.endpoints.AbstractEndpoint.handleFlexClientPollCommand(AbstractEndpoint.java:1151)
在 flex.messaging.endpoints.AbstractEndpoint.serviceMessage(AbstractEndpoint.java:965)
在 flex.messaging.endpoints.AbstractEndpoint$$FastClassByCGLIB$$1a3ef066.invoke()
在 net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
在 org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:692)
在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
在 org.springframework.flex.core.MessageInterceptionAdvice.invoke(MessageInterceptionAdvice.java:66)
在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
在 org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:124)
在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
在 org.springframework.aop.framework.Cglib2AopProxy$FixedChainStaticTargetInterceptor.intercept(Cglib2AopProxy.java:576)
在 flex.messaging.endpoints.AMFEndpoint$$EnhancerByCGLIB$$3ae4b8ad.serviceMessage()
在 flex.messaging.endpoints.amf.MessageBrokerFilter.invoke(MessageBrokerFilter.java:103)
在 flex.messaging.endpoints.amf.LegacyFilter.invoke(LegacyFilter.java:158)
在 flex.messaging.endpoints.amf.SessionFilter.invoke(SessionFilter.java:44)
在 flex.messaging.endpoints.amf.BatchProcessFilter.invoke(BatchProcessFilter.java:67)
在 flex.messaging.endpoints.amf.SerializationFilter.invoke(SerializationFilter.java:166)
在 flex.messaging.endpoints.BaseHTTPEndpoint.service(BaseHTTPEndpoint.java:291)
在 flex.messaging.endpoints.AMFEndpoint$$EnhancerByCGLIB$$3ae4b8ad.service()
在 org.springframework.flex.servlet.MessageBrokerHandlerAdapter.handle(MessageBrokerHandlerAdapter.java:108)
在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771)
在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647)
在 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:563)
在 javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
在 javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:403)
在 org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:286)
在 org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:272)
在 org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1730)
在 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

我做过的测试:
1.FlexClient.getInstance().id = UIDUtil.createUID();无效
2.FlexClient.getInstance().id = null;无效
3.使用不同类型的浏览器,一个用IE,一个用Chrome,打开两个应用都可以;
4.一机一tomcat,用同款浏览器ie打开,没问题;
5.使用flex MXML中的customer AMFChannel或flex-config.xml中默认的AMFChannel定义,无效;

网友预付:
1.http://blogs.adobe.com/lin/2011/05/duplication-session-error.html
2.http://stackoverflow.com/questions/7659775/duplicate-session-error-when-perform-proxy-lookup
两者无效;

有没有人遇到过这种情况?任何建议我将不胜感激。

最佳答案

今天我也遇到了一个 Flex session 问题并遇到了这个 SO 问题。

好吧,这个问题已经很老了,所以我想原始海报可能不再需要任何帮助,但是对于偶然发现这篇文章的人,我也许以下信息可以帮助您。

Flex 应用程序需要来自 Web 应用程序容器(此处为 tomcat)的有效 session ID,并将实际 AMF 请求中找到的 clientOID 绑定(bind)到此 sessionID。

所以原始发布者的问题可能是他试图在两个 tomcat 实例上使用相同的 session ID,这是行不通的,因为每个 tomcat 实例都将 session 保留在自己和内存中。

我的问题是我有一个记录的 jmeter 测试,它不接受记录的 AMF 消息中的 clientID 和 URL 中的 sessionID 的组合。
但是,返回的 AMF 错误消息在 header 部分中包含有效的新 session ID。该错误消息的 AMF header 如下所示(至少对我而言):

Version: 3
(Header #0 name=AppendToGatewayUrl, mustUnderstand=true)
 ";jsessionid=OLD_SESSION_ID;jsessionid=NEW_SESSION_ID"

所以我所做的是从 AMF header 中提取新的 session ID,并将其用于其余的请求。

希望这对任何人有用...

关于apache-flex - 检测到重复的基于 HTTP 的 FlexSession,通常是由于远程主机禁用了 session cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14254469/

相关文章:

java - 使用消息使用者时的 JMS 自动确认

amazon-web-services - 如何增加 AmazonMQ 最大连接数

jakarta-ee - 消费 MQ 消息 : JMS Listener vs Message Driven Bean

apache-flex - Flex 4如何创建加密的SQLite数据库

asp.net-mvc - asp.net mvc 和网络农场

php - 在 PHP 中使用 session 和 cookie 创建安全登录

c# - 如何实现winform session ,尤其是 session 超时

flash - 在没有流媒体服务器的情况下在 Flash 中录制 h.264 视频?

linux - 在 Linux 上自动更新 AIR 应用程序而不提示输入 sudo 密码

apache-flex - Flex ComboBox 中的 Null