java web 会话cookie与session

java web 会话cookie与session,第1张

一、为什么需要Cookie和Session

Http请求时无状态请求,每个请求都是隔离的,无法区分用户的状态。但有时需要区分用户的状态,是否已经登陆过,是否发过请求。
会话技术就是为了识别用户请求的状态,知道请求的用户是谁。

二、HttpSession

服务器端会话,
一般通过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就自动失效了。

三、Cookie

客户端的会话保存技术,通过new Cookie(“”,“”)创建cookie对象,通过response.addCookie(cookie),将对象返回到客户端,cookie保存在浏览器的内存中,用户关闭浏览器cookie对象就会被删除,当通过cookie.setMaxAge()设置最大存活的时间,将会被存储到磁盘中。
request.getCookies()将返回Cookie对象的数组。

四、Session与Cookie的总结

1、Session是保存在服务端的,Cookie是保存在客户端的;
2、Session通过getSession()方式生成,Cookie通过new Cookie()方式生成;
3、Session在到期或者调用invalidate()方法失效删除,Cookie关闭浏览器就会删除;
4、session能够保存Object对象,Cookie只能保存String类型;

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/868966.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存