Servlet规范系列 之 HttpSession源码分析

欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!

  系列文章中《Servlet规范系列 之 Cookie源码分析》讲到Cookie,本文中的HttpSession是与Cookie对应的服务端技术,在服务端首次应答客户端请求时,会首先在服务端生成HttpSession,并存储在服务端存储中。然后将HttpSession的id放入响应头Set-Cookie中,跟随响应一起发送给客户端,客户端存储获得的Cookie,随下次请求一起发送给服务端。服务端根据Cookie中的id值查找对应的HttpSession,确定会话有效性。

  依照本系列的原则,主要分析Servlet API的源码,让我们一起看一下。

  HttpSession

package javax.servlet.http;

import java.util.Enumeration;
import javax.servlet.ServletContext;

/**
 * 提供一种方法,用于跨多个页面请求或访问网站来标识用户,并存储有关该用户的信息. 
 * Servlet容器使用此接口在HTTP客户端和HTTP服务器之间创建会话. 会话在用户的多个连接或页请求中持续指定的时间段.
 * 一个会话通常对应于一个用户,该用户可以多次访问一个站点. 服务器可以通过多种方式维护会话,例如使用cookies或重写url.
 * 这个接口允许servlet查看和操作会话的信息,例如会话标识符、创建时间和上次访问时间将对象绑定到会话,从而允许用户信息在多个用户连接之间保持不变.
 * 当应用程序在会话中存储对象或从会话中删除对象时,会话将检查该对象是否实现HttpSessionBindingListener.
 * 如果是这样,servlet会通知对象它已绑定到会话或从会话中取消绑定.在绑定完成后发送通知.对于无效或过期的会话,将在会话失效或过期后发送通知.
 * 当容器在分布式容器设置中的vm之间迁移会话时,将通知实现HttpSessionActivationListener接口的所有会话属性.
 * 会话信息的作用域仅限于当前的web应用程序(ServletContext),因此存储在一个上下文中的信息在另一个上下文中不会直接可见.
 */
public interface HttpSession {
    
    

    /**
     * 返回Session创建时间.自1970年1月1日午夜起以毫秒计.
     * @return Session创建时间.
     */
    public long getCreationTime();

    /**
     * 返回一个字符串,该字符串包含分配给此会话的唯一标识符.
     * 标识符由servlet容器分配,并且依赖于实现.
     * @return 会话的唯一标识符.
     */
    public String getId();

    /**
     * 返回会话的最后访问时间,即自1970年1月1日午夜起的毫秒数,并用容器接收请求的时间标记. 
     * 应用程序执行的操作,例如获取或设置与会话关联的值,不影响访问时间.
     * @return 会话最后访问时间.
     */
    public long getLastAccessedTime();

    /**
     * 返回此会话所属的ServletContext.
     * @return ServletContext.
     */
    public ServletContext getServletContext();

    /**
     * 指定在Servlet容器使此会话无效之前,客户端请求之间的时间(以秒为单位).负时间表示会话不应超时.
     * 也就是所谓的会话超时时间.
     * @param 会话超时时间.
     */
    public void setMaxInactiveInterval(int interval);

    /**
     * 获取会话超时时间.
     * @return 会话超时时间.
     */
    public int getMaxInactiveInterval();

    /**
     * @deprecated 
     * 获取HttpSessionContext对象.
     */

    public HttpSessionContext getSessionContext();

    /**
     * 返回在此会话中使用指定名称绑定的对象,如果名称下未绑定任何对象,则返回null.
     * @param 对象名.
     * @return 对象值.
     */
    public Object getAttribute(String name);

    /**
     * @deprecated 
     * 使用getAttribute代替此方法.
     */
    public Object getValue(String name);

    /**
     * 返回String对象的枚举,其中包含绑定到此会话的所有对象的名称.
     * @return 所有对象名称的枚举.
     */
    public Enumeration getAttributeNames();

    /**
     * @deprecated
     * 使用getAttributeNames代替此方法.
     */
    public String[] getValueNames();

    /**
     * 使用指定的名称将对象绑定到此会话.如果已将同名对象绑定到会话,则将替换该对象.
     * 此方法执行后,如果新对象实现HttpSessionBindingListener,则容器调用HttpSeSessionBindingListener.valueBound.
     * 容器然后通知web应用程序中的任何HttpSessionAttributeListener.
     * 如果一个对象已经绑定到实现HttpSessionBindingListener的此名称的会话,则其HttpSeSessionBindingListener.valueUnbound方法被调用.
     * 如果传入的值为null,则与调用removeAttribute()具有相同的效果.
     * @param 对象名.
     * @param 对象值.
     */
    public void setAttribute(String name, Object value);

    /**
     * @deprecated 
     * 使用setAttribute代替此方法.
     */
    public void putValue(String name, Object value);

    /**
     * 从此会话中移除使用指定名称绑定的对象.如果会话没有使用指定名称绑定的对象,则此方法不执行任何操作.
     * 此方法执行后,如果对象实现HttpSessionBindingListener,则容器调用HttpSeSessionBindingListener.valueUnbound.
     * 容器然后通知web应用程序中的任何HttpSessionAttributeListener.
     * @param 对象名称.
     */
    public void removeAttribute(String name);

    /**
     * @deprecated 
     * 使用removeAttribute替换此方法.
     */
    public void removeValue(String name);

    /**
     * 使此会话无效,然后解除绑定到该会话的所有对象.
     */
    public void invalidate();

    /**
     * 如果客户端尚不知道会话或客户端选择不加入会话,则返回true.
     * 例如,如果服务器只使用基于cookie的会话,而客户机禁用了cookies的使用,那么每个请求都会有一个新的会话.
     * 也就是说服务端创建了session,是否已经同步给客户端.
     * @return 服务器已创建会话,但客户端尚未加入.
     */
    public boolean isNew();

}

  若文中存在错误和不足,欢迎指正!

本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/securitit/article/details/108046250
今日推荐