Register new undertow SessionManager

2019-04-11 12:52发布

问题:

I have wildfly 8.1 server running. I have my own SessionManager implementing io.undertow.server.session.SessionManager. And i want to configure the system to use my session manager.

Where and how should i configure/add new settings for my session manager?

回答1:

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) {

    }
}

To override default InMemmorySessionManager with another SessionManager following steps should be done:

  1. Develop SessionManager which implements io.undertow.server.session.SessionManager
  2. Develop SessionManagerFactory which implements io.undertow.servlet.api.SessionManagerFactory
  3. Develop startup extension which implements io.undertow.servlet.ServletExtension, and in handleDeployment(Deployment) method change sessionManagerFactory with new SessionManagerFactory.
  4. Register new ServletExtension by adding ../META-INF/services/io.undertow.servlet.ServletExtension file (file should contain the name of new ServletExtension. for example com.my.utils.StartupExtension)