package com.liuxinglanyue.session; import java.io.IOException; import javax.servlet.ServletException; import org.apache.catalina.Session; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; import org.apache.catalina.valves.ValveBase; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; public class SessionHandlerValve extends ValveBase { private final static Log log = LogFactory.getLog(SessionHandlerValve.class); private AbstractSessionManager sessionManager; public void setSessionManager(AbstractSessionManager sessionManager) { this.sessionManager = sessionManager; } @Override public void invoke(Request request, Response response) throws IOException, ServletException { try { this.getNext().invoke(request, response); } finally { storeSession(); } } /** * 存储session * @param session * @throws IOException */ private void storeSession() throws IOException { Session session = sessionManager.currentSession.get(); if(null == session) { return; } try { if(session.isValid()) { log.trace("Request with session completed, saving session " + session.getId()); if(null != session.getSession()) { log.trace("HTTP Session present, saving " + session.getId()); sessionManager.save(session, sessionManager.getAlwaysSaveAfterRequest()); } else { log.trace("No HTTP Session present, Not saving " + session.getId()); } } else { log.trace("HTTP Session has been invalidated, removing :" + session.getId()); sessionManager.remove(session); } } catch(Exception e) { log.error("Error storing/removing session", e); } finally { sessionManager.currentSession.remove(); sessionManager.currentSessionId.remove(); sessionManager.currentSessionIsPersisted.remove(); log.trace("Session removed from ThreadLocal :" + session.getIdInternal()); } } }