重新登录Flex导致Channel.Connect.Failed错误NetConnection.Call.Failed:HTTP:状态500:url

时间:2012-08-08 09:01:31

标签: java flex authentication login blazeds

我们在使用Flex 4,BlazeDS和WebLogic 10.3.5在我们的Flex应用程序中重新登录时遇到问题。

导致问题的用例如下:

  1. 在浏览器中启动应用程序。
  2. 使用j_security_check操作重定向到登录表单页面。
  3. 登录并使用该应用程序。
  4. 点击浏览器中的“后退”按钮。
  5. 再次登录表单页面。
  6. 再次登录。
  7. 在BlazeDS中获取异常并在Flex / ActionScript中捕获Fault。
  8. 登录WLS时遇到异常:

    [BlazeDS]Unexpected error encountered in Message Broker servlet
    flex.messaging.LocalizedException: The FlexSession is invalid.
            at flex.messaging.FlexSession.checkValid(FlexSession.java:943)
            at flex.messaging.FlexSession.getUserPrincipal(FlexSession.java:254)
            at flex.messaging.HttpFlexSession.getUserPrincipal(HttpFlexSession.java:286)
            at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:296)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
            at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
            at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
            at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
            at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)
            at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3717)
            at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
            at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
            at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
            at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
            at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
            at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
            at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
            at weblogic.work.ExecuteThread.run(ExecuteThread.java:178)
    

    Flex / ActionScript中捕获的错误:

    faultCode: Client.Error.MessageSend
    faultString: Send failed
    faultDetail: Channel.Connect.Failed error NetConnection.Call.Failed: HTTP: Status 500: url: 'http://server:port/web-project/messagebroker/amf'
    

    似乎是BlazeDS获得了第二个会话,而第一个会话仍然有效且活跃。

    有谁知道,这确实导致了这个问题以及如何优雅地解决它们?我有一些提示,但不知道它们是否足够合适:

    • 在Flex / ActionScript中捕获故障,重定向到注销页面以使会话无效,然后重定向到登录页面并创建新会话。
    • 通过JavaScript禁用浏览器中的“后退”按钮。

    我将不胜感激任何建议,解释和建议。感谢。

2 个答案:

答案 0 :(得分:1)

问题在于会话固定。

会发生什么:

  • 您登录
  • 你得到一个会话
  • 您获得FlexSession(设置为会话属性)
  • 您点击后退按钮
  • 您登录(传递旧的jsessionid)

Spring的SessionFixationProtectionStrategy:

  • 检测到jsessionid的会话有效
  • 提取旧会话的属性
  • 使会话无效(销毁它)
  • 创建新会话
  • 将旧会话的属性转移到新会话

当旧会话被破坏时,FlexSession变为“无效”。

创建会话时会再次创建FlexSessions, 并且由于策略传递了相同的引用,该引用无效 (厚厚的俄语口音)“我们有问题”

通过将策略bMigrateAttributes设置为false,可以轻松解决此问题:

<security:session-management session-authentication-strategy-ref="sas" />
  <bean id="sas class="org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy"   p:migrateSessionAttributes="false"/>

http://static.springsource.org/spring-security/site/docs/3.0.x/reference/session-mgmt.html

希望这会有所帮助

答案 1 :(得分:0)

我遇到了同样的问题,但是我想保留所有会话属性,不仅是Spring的,因此我没有将 migrateSessionAttributes 设置为false来保留非spring的属性。会话固定属性。

我最终覆盖了 SessionFixationProtectionStrategy ,因此我仍然可以从会话固定中受益,它将迁移所有属性。

onSessionChange 方法中,我专门删除了“ __flexSession”属性

muscle pain (pain)