欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!
系列文章中《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();
}
若文中存在错误和不足,欢迎指正!
本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!