Http请求时无状态请求,每个请求都是隔离的,无法区分用户的状态。但有时需要区分用户的状态,是否已经登陆过,是否发过请求。
会话技术就是为了识别用户请求的状态,知道请求的用户是谁。
服务器端会话,
一般通过request.getSession()获取到Session对象。当用户第一次调用getSession()时,如果不存在session,就会通过ManagerBase#createSession(sessionid)创建session对象(StandardSession),sessionId根据特殊的算法生成。并通过ManagerBase#add(session)将session对象到ConcurrentHashMap中。所以说session对象有容器统一管理。
public class ManagerBase{
//用来保存session对象
protected Map<String, Session> sessions = new ConcurrentHashMap<>();
@Override
public Session createSession(String sessionId) {
if ((maxActiveSessions >= 0) &&
(getActiveSessions() >= maxActiveSessions)) {
rejectedSessions++;
throw new TooManyActiveSessionsException(
sm.getString("managerBase.createSession.ise"),
maxActiveSessions);
}
// 创建空的session对象
Session session = createEmptySession();
// Initialize the properties of the new session and return it
session.setNew(true);
session.setValid(true);
session.setCreationTime(System.currentTimeMillis());
session.setMaxInactiveInterval(getContext().getSessionTimeout() * 60);
String id = sessionId;
if (id == null) {
id = generateSessionId();
}
//将session保存到Managerbase#sessions中
session.setId(id);
sessionCounter++;
SessionTiming timing = new SessionTiming(session.getCreationTime(), 0);
synchronized (sessionCreationTiming) {
sessionCreationTiming.add(timing);
sessionCreationTiming.poll();
}
return session;
}
@Override
public void add(Session session) {
sessions.put(session.getIdInternal(), session);
int size = getActiveSessions();
if( size > maxActive ) {
synchronized(maxActiveUpdateLock) {
if( size > maxActive ) {
maxActive = size;
}
}
}
}
}
public class StandardSession{
@Override
public void setId(String id, boolean notify) {
if ((this.id != null) && (manager != null))
manager.remove(this);
this.id = id;
if (manager != null)
//添加session到map中
manager.add(this);
if (notify) {
tellNew();
}
}
}
什么时候销毁session
StandardSession#isValid()判断有效期,如果过期了,则删除session
StandardSession#invalidate()方法,直接调用expire()删除session
服务器卸载了当前Web应用;
由于会有越来越多的用户访问服务器,因此Session也会越来越多。为了防止内存溢出,服务器会把长时间内没有活跃的Session从内存中删除,而这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。
客户端的会话保存技术,通过new Cookie(“”,“”)创建cookie对象,通过response.addCookie(cookie),将对象返回到客户端,cookie保存在浏览器的内存中,用户关闭浏览器cookie对象就会被删除,当通过cookie.setMaxAge()设置最大存活的时间,将会被存储到磁盘中。
request.getCookies()将返回Cookie对象的数组。
1、Session是保存在服务端的,Cookie是保存在客户端的;
2、Session通过getSession()方式生成,Cookie通过new Cookie()方式生成;
3、Session在到期或者调用invalidate()方法失效删除,Cookie关闭浏览器就会删除;
4、session能够保存Object对象,Cookie只能保存String类型;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)