1

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

导致问题的用例如下:

  1. 在浏览器中启动应用程序。
  2. 使用 j_security_check 操作重定向到登录表单页面。
  3. 登录并使用应用程序。
  4. 在浏览器中点击“返回”按钮。
  5. 再次来到登录表单页面。
  6. 重新登录。
  7. 在 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 禁用浏览器中的“后退”按钮。

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

4

2 回答 2

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

希望这可以帮助

于 2013-01-22T21:55:53.917 回答
0

我遇到了同样的问题,但我想保留所有会话属性,而不仅仅是 Spring 属性,所以我没有将migrateSessionAttributes设置为 false 以在会话固定时保留非弹簧属性。

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

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

package xxxxx;

import javax.servlet.http.HttpSession;

import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy;
import org.springframework.stereotype.Component;


@Component
public class MySessionFixationProtectionStrategy extends SessionFixationProtectionStrategy {
    private static String FLEX_SESSION_ATTRIBUTE = "__flexSession";

    @Override
    protected void onSessionChange(String originalSessionId, HttpSession newSession, Authentication authentication) {
        // We remove the flex session attribute to avoid "The FlexSession is invalid." exception
        newSession.removeAttribute(FLEX_SESSION_ATTRIBUTE);

        super.onSessionChange(originalSessionId, newSession, authentication);
    }
}
于 2018-08-06T18:01:10.063 回答