1. 概述
(1)在HttpRequestBase的doGetSession()中,
a. 会使用manager=context.getManager->session=manager.findSession(reqSessionId)
b. manager可以使用file或database持久化session
2. Sessions
(1) 由于安全问题使用StandardSessionFacade传入servlet
(2)UML图:
package com.cisco.tomcat.sessionmanager;
import java.security.Principal;
import javax.servlet.http.HttpSession;
import org.apache.catalina.Manager;
import org.apache.catalina.SessionListener;
import com.cisco.pattern.iterator.Iterator;
public interface Session {
public static final String SESSION_CREATED_EVENT = "createSession";
public static final String SESSION_DESTROY_EVENT = "destroySession";
public String getInfo();
public void setNew(boolean isNew);
public long getLastAccessedTime();
public HttpSession getSession();
public void access();
public void expire();
public void recycle();
public String getAuthType();
public void setAuthType(String authType);
public long getCreateTime();
public void setCreateTime(long createTime);
public String getId();
public void setId(String id);
public Manager getManager();
public void setManager(Manager manager);
public int getMaxInactiveInterval();
public void setMaxInactiveInterval(int interval);
public Principal getPrincipal();
public void setPrincipal(Principal principal);
public boolean isValid();
public void setValid(boolean valid);
public Object getNote(String name);
public Iterator getNoteNames();
public void removeNote(String name);
public void setNote(String name, Object value);
public void addSessionListener(SessionListener listener);
public void removeSessionListener(SessionListener listener);
}
3. ManageBase类:
(1)使用HashMap存储session
public class ManagerBase implements Manager {
protected HashMap<Object, Object> sessions = new HashMap<>();
@Override
public void add(Session session) {
synchronized (sessions) {
sessions.put(session.getId(), session);
}
}
@Override
public void remove(Session session) {
synchronized (sessions) {
sessions.remove(session.getId());
}
}
@Override
public Session findSession(String id) throws IOException {
if(id == null) {
return null;
}
synchronized (sessions) {
Session session = (Session)sessions.get(id);
return session;
}
}
@Override
public Session[] findSessions() {
Session results[] = null;
synchronized (sessions) {
results = new Session[sessions.size()];
results = (Session[])sessions.values().toArray(results);
}
return results;
}
}
4. Store类;
5. Bootstrap类
代码:Context.setManager(sessionManager), 在httpRequestBase中的getSession中调用manager.createSession()