如何在用户登录BlazeDS时将属性设置为FlexSession?

时间:2014-07-02 07:08:55

标签: java tomcat blazeds

在我的应用程序中,我希望在登录时在会话中存储有关用户的一些数据。它将从数据库中检索并通过调用flexSession.setAttribute('age',n)放置在FlexSession中。我在JDBC领域使用 Tomcat 。问题是,当用户使用他的登录名和密码进行身份验证时,如何在FlexSession中放置一些数据?

我知道有一个带有

的flex.messaging.security.LoginManager.java
 if (username != null && credentials != null)
            {
                Principal authenticated = loginCommand.doAuthentication(username, credentials);

                if (authenticated == null) // Invalid login.
                {
                    SecurityException se = new SecurityException();
                    se.setMessage(INVALID_LOGIN);
                    se.setCode(SecurityException.CLIENT_AUTHENTICATION_CODE);
                    throw se;
                }
                setCurrentPrincipal(authenticated);
            }

但我不确定我是否可以轻松覆盖它(管理器在MessageBroker实现中实例化)。因此,我只需要找到创建FlexSession的位置,使用用户名和密码并设置其他一些属性。

或者我可以通过添加

来使用FlexSessionListener
FlexSession.addSessionCreatedListener(new CustomFlexSessionListener());

但到了哪里?

期待您的想法。感谢。

1 个答案:

答案 0 :(得分:0)

此处的解决方案:http://oncer-l.iteye.com/blog/1897972。 需要在services-config文件中创建并指定新的Bootstrap服务:

<service id="listener" class="test.ListenersBootstrapService" />     

它将在servlet启动时执行,因此我们在其中添加:

@Override
public void initialize(String arg0, ConfigMap arg1) {
    // TODO Auto-generated method stub
    System.out.println("hello from init bootstrap listener!");

    MyFlexSessionListener sessionListener = new MyFlexSessionListener(); 
    FlexSession.addSessionCreatedListener(sessionListener); 

}

其中

class MyFlexSessionListener implements FlexSessionListener { 

    public void sessionCreated(FlexSession session) 
    { 
        System.out.println("FlexSession created: " + session.getId()); 
        session.setAttribute("gender", "male");     
    } 
} 

非常感谢文章的作者。

然而,问题是FlexContext.getUserPrincipal()或session.getUserPrincipal()返回null,可能是因为首先创建了会话,然后进行了身份验证。需要找到在userPrincipal上监听属性更改事件的方法。