1.什么是会话与会话状态
1.1 会话是指一个客户端与web服务器之间连续发生的一系列请求和响应的过程。就像是从拨通电话到挂断电话之间聊天的过程就是一个会话。
1.2 web应用的会话状态是指服务器与浏览器在会话过程中产生的状态信息,借助会话状态,web服务器能够把属于同一会话中的一系列请求和响应过程关联起来,使得他们之间可以相互依赖和传递信息。例如在一个购物网站购买东西,结算时必须知道登录请求表单的结果,以便知道是哪个账户在操作。还必须知道已选商品的信息。其中的用户登录的账户信息和已选商品信息就是会话的状态信息。
2.cookies与session
由于http协议本身就是不具有会话状态,web应用需要使用cookies或session来维持会话状态和实现会话管理。
2.1 cookies
cookies是在浏览器访问web服务器的某个资源时, 由web服务器在HTTP响应消息头中附带传给浏览器的一些数据。其具体过程图:
2.1.1 客户端请求服务器,如果服务器需要记录该用户状态,web服务器通过在HTTP消息头增加Set_Cookies响应头字段将cookies发送给浏览器。即向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。基于springMVC的cookies的操作可以参照如下cookies的操作
2.1.2 一个cookies只能标识一种信息,它至少含有一个标识该信息的名称name和值value,一个web站点可以给一个web浏览器发送多个cookies,这样就能在web浏览器和服务器之间使用多个cookies来传递信息。例如用一个cookies来标识访问者的账号信息,一个cookies来标识用户登录该站点的次数。
注意:cookies需要浏览器的支持,而且不同浏览器有不同保存cookies的方式。
2.2 session
2.2.1 什么是session
cookies是客户端保存状态的方案,那么session是服务端保持状态的方案。就像医院发放给病人的病历卡和医院为每个病人都保存的档案的结合。病历卡只有id,在医院出示病历卡时,医院系统都能根据其id找到病人的档案,并进行相应的操作。
2.2.2 HttpSession
HttpSession接口定义了各种管理和操作会话状态的方法。每个客户端都有对应着其各自的HttpSession对象。由于创建HttpSession需要小号内存资源,Servlet并不会一开始就创建该对象,只有访问某个特殊的Servlet程序,并且这程序决定于客户端开启一个会话时才会创建该对象。并且会为这个对象分配一个独一无二的会话标识号SessionID,然后响应消息中将这个标致号传给客户端。后续客户端只需将这个标识号传给服务器,服务器依据其标识号选择对应的HttpSession对象。
HttpSession停留在服务器内存也是有时间限定的。默认值由servlet容器决定,用tomcat的可以在tomcat的安装路径里的conf/Web.xml定义:
<session-config><session-timeout>30</session-timeout> </session-config>
默认30分钟,设置0或负数会话永不超时。
2.2.3 HttpSession接口的相关方法
(1) getId():返回HttpSession对象关联的会话标识号
(2) getCreateTime 返回当前该对象创建的时间,返回值是一个自从1970年1月1日的0时0分0秒开始计算的毫秒数
(3) getLastAccessedTime 返回上一次访问该对象的时间,返回值同上。
(4) setMaxInactiveInterval/getMaxInactiveInterval 操作该对象的超时默认时间。
(5) Invalidate 强制当前的HttpSession对象无效,使服务器立即释放该对象。常用于注销操作。
(6) getServletContext 用于返回当前HttpSession对象所属的ServletContext对象。
(7) setAttribute/getAttribute 在内部定义一个hashmap类型的成员变量,该方法则是向这个hashmap对象增加键值对对象,和根据名称获取对象。如:
User user=new User("男","李"); HttpSession session=request.getSession();//当前的session session.setAttribute("user",user); //session.getAttribute("user",user);
2.2.4 HttpServletRequest接口的Session
(1)getSession方法 该方法有两个重载方法:
public HttpSession getSession(boolean create); public HttpSession getSession();
第一个方法根据传送参数来决定是否创建HttpSession对象。true就创建新的HttpSession对象,并返回,false如果没有会话则返回null。
第二个方法如果没有会话则创建一个新的会话。