我们在使用 Flex 4、BlazeDS 和 WebLogic 10.3.5 重新登录 Flex 应用程序时遇到问题。
导致问题的用例如下:
- 在浏览器中启动应用程序。
- 使用 j_security_check 操作重定向到登录表单页面。
- 登录并使用应用程序。
- 在浏览器中点击“返回”按钮。
- 再次来到登录表单页面。
- 重新登录。
- 在 BlazeDS 中获取异常并在 Flex/ActionScript 中捕获错误。
在 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 禁用浏览器中的“后退”按钮。
我将不胜感激任何建议、解释和建议。谢谢。