注册新的undertow SessionManager

Register new undertow SessionManager

我有 wildfly 8.1 服务器 运行。我有自己的 SessionManager 实现 io.undertow.server.session.SessionManager。我想配置系统以使用我的会话管理器。

我应该在哪里以及如何 configure/add 我的会话管理器的新设置?

public class StartupBeanExtension implements Extension, ServletExtension {
    @Override
    public void handleDeployment(DeploymentInfo deployment, ServletContext context) {
        boolean sessionPersistenceEnabled = Boolean.parseBoolean(BeanUtils.getBean(PropertyResolver.class).getValue("UAM.SessionPersistenceEnabled"));
        if (sessionPersistenceEnabled) {
            System.out.println("Overriding default InMemorySessionManager...[" + deployment.getDeploymentName() + ", " + deployment.getDisplayName() + "]");
            deployment.setSessionManagerFactory(new UAMSessionManagerFactory());
        } else {
            System.out.println("InMemorySessionManager IS NOT OVERIDED!");
        }
    }    
}

public class UAMSessionManagerFactory implements SessionManagerFactory {
    @Override
    public SessionManager createSessionManager(Deployment deployment) {
        UAMSessionManager ss = new UAMSessionManager(deployment.getDeploymentInfo().getDeploymentName());
        return ss;
    }
}

public class UAMSessionManager extends InMemorySessionManager {

    public UAMSessionManager(String deploymentName) {
        super(deploymentName);

        UAMSessionListener uamSessionListener = new UAMSessionListener();
        super.registerSessionListener(uamSessionListener);

        System.out.println("New session manager created. Listener activated.");
    }

    // create session
    public Session createSession(final HttpServerExchange serverExchange, final SessionConfig config, String sessionID) {
        config.setSessionId(serverExchange, sessionID);
        Session session = super.createSession(serverExchange, config);
        return session;
    }

    // get session
    public Session getSession(final HttpServerExchange serverExchange, final SessionConfig config) {
        final String sessionId = config.findSessionId(serverExchange);
        Session session = getSession(sessionId);

        if (session == null) {
            // DO SOMETHING TO CREATE SESSION OR RESTORE IT FROM DB
            try {
                UAMService uam = getUAMService();
                if (uam != null) {
                    Sessions storedSession = uam.getSession(sessionId);

                    if (storedSession != null) {
                        String storedSessionId = storedSession.getSessionId();
                        // create new session with storedSessionID
                        session = createSession(serverExchange, config, storedSessionId);

                        // SET session attributes if needed from storedSession to new one

                    } else {
                        // let InMemorySessionManager create new session
                        return null;
                    }
                }
            } catch (Exception ex) {

            }
        }

        return session;
    }
}

public class UAMSessionListener implements SessionListener {

    @Override
    public void sessionCreated(Session session, HttpServerExchange exchange) {

    }

    @Override
    public void sessionDestroyed(Session session, HttpServerExchange exchange, SessionDestroyedReason reason) {

    }

    @Override
    public void attributeAdded(Session session, String name, Object value) {
        UAMService uamService = getUAMService();

        if (uamService != null) {
            Sessions storedSession = uamService.getSession(session.getId());
            boolean isNew = false;
            if (storedSession == null) {
                storedSession = new Sessions();
                storedSession.setSessionId(session.getId());
                storedSession.setActvityDate(new Date());
                isNew = true;
            }

            // STORE SOME INFO FROM value and update/create it in storage
            uamService.updateSession(storedSession, isNew);
        }
    }

    @Override
    public void attributeUpdated(Session session, String name, Object newValue, Object oldValue) {

    }

    @Override
    public void attributeRemoved(Session session, String name, Object oldValue) {

    }

    @Override
    public void sessionIdChanged(Session session, String oldSessionId) {

    }
}

要用另一个 SessionManager 覆盖默认的 InMemmorySessionManager,应执行以下步骤:

  1. 开发实现io.undertow.server.session.SessionManager
  2. 的SessionManager
  3. 开发实现io.undertow.servlet.api.SessionManagerFactory
  4. 的SessionManagerFactory
  5. 开发实现 io.undertow.servlet.ServletExtension 的启动扩展,并在 handleDeployment(Deployment) 方法中将 sessionManagerFactory 更改为新的 SessionManagerFactory。
  6. 通过添加 ../META-INF/services/io.undertow.servlet.ServletExtension 文件注册新的 ServletExtension(文件应包含新的 ServletExtension 的名称。例如 com.my.utils.StartupExtension)