一 Session的简介
1.Session出现的原因是Cookie存在的缺点:
Cookie的缺点:使用Cookie可以保存上一次请求的状态信息,但是如果传输的数量较多,会降低传输的效率和增大服务端程序处理的难度
2.Session的概念
Session是一种将会话状态保存在服务端的技术,它可以比喻成是医院发放给病人的病历卡和医院为每个病人保留的病历档案的结合方式 。
3.Session的应用介绍
客户端需要接收、记忆和回送 Session的会话标识号,Session可以且通常是借助Cookie来传递会话标识号。
4.Session的会话流程介绍
当浏览器请求--àweb服务器某个servlet程序会话开始,在服务器开辟一个存储区域,有一个唯一标示的,用来保存会话状态的区域(HttpSession对象)--à把会话ID通过相应的应答消息保存在客户端浏览器--à当在访问的时候,会封装会话ID,servlet会通过ID寻找
二 Session的跟踪机制
1.Servlet API规范中定义了HttpSession接口。httpSeecion的对象是保存了会话状态信息的存储结合,一个客户端在web服务端对应一个各自的httpSession对象。
2.HttpSession对象是保持会话状态信息的存储结构,一个客户端在WEB服务器端对应一个各自的HttpSession对象。
3.WEB服务器并不会在客户端并不是一开始访问就创建,而是访问某个能与客户端开启回话的servlet程序时WEB应用程序才会创建一个与该客户端对应的HttpSession对象。
4.WEB服务器为HttpSession对象分配一个独一无二的会话标识号,然后在响应消息中将这个会话标识号传递给客户端。客户端需要记住会话标识号,并在后续的每次访问请求中都把这个会话标识号传送给WEB服务器,WEB服务器端程序依据回传的会话标识号就知道这次请求是哪个客户端发出的,从而选择与之对应的HttpSession对象。
5.Web在创建了某个客户端对应的httpSession对象之后,只有没有超过 一个限定的空闲时间段,可以任意访问,如果超过了时间,就自动停止了会话。
6.HttpSession接口中专门定义了一个setAttribute方法来将对象存储到HttpSession对象中,还定义了一个getAttribute方法来检索存储在HttpSession对象中的对象,存储进HttpSession对象中的对象可以被属于同一个会话的各个请求的处理程序共享。
例子:(1)在SessionDemo1中设置属性
// 请求域中设置
String name = "张三";
request.setAttribute("name", name);
//在一次会话中设置---对上一个的覆盖
String name1 = "李四";
HttpSession session = request.getSession();
// 保存到会话中
session.setAttribute("name", name1); // 覆盖的操作
//在整个应用中设置
String name2 = "王五";
ServletContext context =this.getServletContext();
context.setAttribute("name", name2);
(2) 在sessionDemo2中获取属性
//获取从请求域中的对象
String name = (String) request.getAttribute("name");
//获取从Session会话中得到的属性
HttpSession session = request.getSession();
String name1 = (String) session.getAttribute("name");
//获取上下文对象的属性
ServletContext context =this.getServletContext();
String name2 = (String) context.getAttribute("name");
注:
HttpSession session = request.getSession();这句话有两种含义
(1)是第一次创建一个会话对象 创建一个唯一标示的ID 保存在服务端
(2) 获取session对象的引用 根据请求消息中的session去查找服务器中是否存在getSession的ID,请求消息中的ID和session对象中的ID是否一致
(3)当创建一个Session之后,会自动有一个会话ID标识,并且这个会话ID会保存在Cookie中,有Cookie发送给客户端,这是一个线程的结束,当在访问的时候,把磁盘的Cookie封装后发送给Web服务器。Cookie是一个临时的储存ID的。
(4)以上三种的使用
请求域的作用于是最小的
在同一个会话范围之内 是用Session
在不同会话中的范围内 用ServletContext
(5) Application域范围的属性,是整个应用程序对象
7. Session是实现网上商城的购物车的最佳方案,存储在某个客户Session中的一个集合对象就可充当该客户的一个购物车。
购物车的流程:
首页:看到所有的商品 InitServlt.class
1 洗衣机 800 <a href=”/demoWeb/buyServlet?id=1”>加入购物</a>
2 电视 800 <a href=”/demoWeb/buyServlet?id=2”>加入购物</a>
3 MP4 800 <a href=”/demoWeb/buyServlet?id=3”>加入购物</a>
4 录音机 800 <a href=”/demoWeb/buyServlet?id=4”>加入购物</a>
请求提交给 BuyServlet.class
获取要购买的商品的ID,获取对应的商品对象good
要判断
List cart = new LinkedList();
Cart.add(good);
Session.setAttribute(cart);
跳转到现实购物车的页面,由这个界面去实现所有要的货物 ListCartServlet.class
三 Session的超时管理
1.超时管理的作用
WEB服务器采用“超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间之内没有发出后续请求,WEB服务器则认为客户端已经停止了活动,结束与该客户端的会话并将与之对应的HttpSession对象变成垃圾。
2.超时管理的原理
如果客户端浏览器超时后再次发出访问请求,WEB服务器则认为这是一个新的会话的开始,将为之创建新的HttpSession对象和分配新的会话标识号。
3.超时管理的设置
(1)在某一个工程的web.xml中设置
<session-config>
<session-timeout>1</session-timeout>
</session-config>
(2)在文件夹下的conf下的web.xml下设置
<session-config>
<session-timeout>1</session-timeout>
</session-config>
四 httpSession接口中的方法
(1)getId方法
(2)getCreationTime方法
(3)getLastAccessedTime方法
(4)setMaxInactiveInterval方法
(4)getMaxInactiveInterval方法
(5)isNew方法
* 如果客户端请求消息中返回了一个与Servlet程序当前获得的HttpSession对象的会话标识号相同的会话标识号,则认为这个HttpSession对象不是新建的。
(6)invalidate方法
(7)getServletContext方法
(8)setAttribute方法
(9)getAttribute方法
(10)removeAttribute方法
(11)getAttributeNames方法
五 HttpServletRequest接口中的Session方法
(1)getSession方法
ü public HttpSession getSession(boolean create)
ü public HttpSession getSession()
(2)isRequestedSessionIdValid方法
(3)isRequestedSessionIdFromCookie方法
(4)isRequestedSessionIdFromURL方法
注:注销的操作就是让这次会话强制的结束
六 httpSession初始化参数的比较
获取会话对象 ---------方法重载----功能是一样的
HttpSession session = request.getSession(true);
HttpSession session = request.getSession();
功能是:如果session对象不存在 创建session对象或者
如果session存在,获取session对象的引用
HttpSession session = request.getSession(false);
功能:如果session对象不存在 返回的是null
如果session存在 返回的是session对象的引用
实例应用:用户只要在登入了之后才可以购物,不肯能没有登入随便购物
LoginServlet.class 登入
HttpSession session = request.getSession();
Session.setAttribute(“name”,name);账号
转到web的其他页面去查看
BuyServlet.class:
List cart 购物车
Cart.add(good);
//不让在其他的页面中创建,而是获取,设置为fasle之后,条件不成力,不能往下执行
HttpSession session = request.getSession(false);
If(session==null){
跳转到登入的页面
}
Session.add(cart);