检测到基于HTTP的重复FlexSession,通常是由于远程主机禁用会话cookie

时间:2013-01-10 09:24:47

标签: flex session jms blazeds consumer

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

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

错误日志   1.flex客户端日志(flash.log):     检测到基于HTTP的重复FlexSession,通常是由于远程主机禁用会话Cookie。必须启用会话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)         at 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)         at 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.使用不同类型的浏览器,一个使用,另一个使用Chrome,打开两个应用程序,它们都可以;   4.一个服务器一个tomcat,使用同一种浏览器即打开它们,它们都可以;   5.在flex MXML中使用客户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   这两个是无效的;

以前是否有人遇到过这种情况?任何建议,我将不胜感激。

1 个答案:

答案 0 :(得分:3)

今天我遇到了一个Flex会话问题并遇到了这个问题。

嗯,这个问题已经很老了,所以我猜原版海报可能不再需要任何帮助了,但是对于那些偶然发现这篇文章的人来说,我可能以下信息可以帮助你。

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

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

我的问题是我有一个记录的jmeter测试,它不会接受记录的AMF消息中的clientID和URL中的sessionID的组合。 但是,返回的AMF错误消息在标题部分中包含有效的新会话ID。该错误消息的AMF标题看起来像那样(至少对我而言):

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

所以我所做的就是从AMF头中提取新的会话ID,并将其用于其余的请求。

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