Register new undertow SessionManager

匿名 (未验证) 提交于 2019-12-03 07:50:05

问题:

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)


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!