Session的跟踪机制
Sessionr的超时管理
HttpSession接口中的方法
HttpServletRequest接口中的Session的方法
application与session域范围的属性比较
利用Cookie实现Session跟踪
利用URL重写实现Session跟踪
一、什么是Session
1、使用Cookie和附加URL参数都可以将上一次请求的状态信息传递到下一次请求中,但是如果传递的状态信息较多,将极大降低网络传输效率和增大服务器端程序处理的难度。
2、Session技术是一种将会话状态保存在服务器端的技术,它可以比喻成是给病人的病历卡和医院为每个病人保留的病历档案的结合方式。
当浏览器----发请求--àweb服务器某个servlet程序 会话开始 ,一个唯一的标识(称为会话id)
开辟存储区域,保存会话状态存储区域--------保存在HttpSession对象中中
浏览器(id)ß--------------------id
浏览器------(id)--------àservlet
当浏览器关闭,会话结束
3、客户端需要接收、记忆和回头Session的会话标识号,Session可以且通常是借助Cookie来传递会话标识号。
二、Session的跟踪机制
帮助文档Javax.servlet.http.httpSession 接口
1、 Servlet API规范中定义了一个HttpSession接口,HttpSession接口定义了各种管理和操作会话状态的方法。
2、 HttpSession对象是保持会话状态信息的存储结构,一个客户端在WEB服务器端对应一个各自的HttpSession对象。
3、 WEB服务器并不会在客户端开始访问它时就创建HttpSession对象,只有客户端访问某个能与客户端开启会话的Servlet程序时,WEB应用程序才会创建一个与该客户端对应的HttpSession对象。
4、 WEB服务器为HttpSession对象分配一个独一无二的会话标识号,然后在响应消息中将这个会话标识号传递给客户端。客户端需要记住会话标识号,并在后续的每次访问请求中都把这个会话标识号传送给WEB服务器,WEB服务器端程序依据回传的会话标识号就知道这次请求是哪个客户端发出的,从而选择与之对应的HttpSession对象。
5、 WEB应用程序创建了与某个客户端对应的HttpSession对象后,只要没有超出一个限定的空闲时间段,HttpSession对象就驻留在WEB服务器内存之中,该客户端此后访问任意的Servlet程序时,它们都使用与客户端对应的那个已存在的HttpSession对象。
6、 HttpSession接口中专门定义了一个setAttribute方法来将对象存储到HttpSession对象中,还定义了一个getAttribute方法来检索存储在HttpSession对象中的对象,存储进HttpSession对象中的对象可以被属于同一个会话的各个请求的处理程序共享。
7、 Session是实现网上商城的购物车的最佳方案,存储在某个客户Session中的一个集合对象就可充当该客户的一个购物车。
三、Session的超时管理
1、WEB服务器无法判断当前的客户端浏览器是否还会继续访问,也无法检测客户端浏览器是否关闭,所以,即使客户已经离开或关闭了浏览器,WEB服务器还要保留与之对应的HttpSession对象。
2、 随着时间的推移而不断增加新的访问客户端,WEB服务器内存中将会因此积累起大量的不再被使用的HttpSession对象,并将最终导致服务器内存耗尽。
3、 WEB服务器采用“超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间之内没有发出后续请求,WEB服务器则认为客户端已经停止了活动,结束与该客户端的会话并将与之对应的HttpSession对象变成垃圾。
4、 如果客户端浏览器超时后再次发出访问请求,WEB服务器则认为这是一个新的会话的开始,将为之创建新的HttpSession对象和分配新的会话标识号。
5、 会话的超时间隔可以在web.xml文件中设置,其默认值由Servlet容器定义。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
四、HttpSession接口中的方法
1、getId方法
2、getCreationTime方法
3、getLastAccessedTime方法 ------得到上一次毫秒数
4、setMaxInactiveInterval方法 ------可以修改有效的时间
5、getMaxInactiveInterval方法
6、isNew方法 ------判断是否是新建的
* 如果客户端请求消息中返回了一个与Servlet程序当前获得的HttpSession对象的会话标识号相同的会话标识号,则认为这个HttpSession对象不是新建的。
6、 invalidate方法 ------强制session对象失效
7、 getServletContext方法 ------得到上下文对象
8、 setAttribute方法 ------设置属性
9、 getAttribute方法
10、 removeAttribute方法 ------删除会话状态
11、 getAttributeNames方法 ------得到会话状态的名字
五、HttpServletRequest接口中的Session方法
1、getSession方法
HttpSession session=request.getSession(true);
HttpSession session=request.getSession();
功能:如果session对象不存在,创建session对象,如果session对象已经存在,获取session对象的引用
HttpSession session=request.getSession(false);
功能:如果session存在,返回session对象的引用,如果session对象不存在,返回null
LoginServlet:
HttpSession session=request.getSession(); 得到会话对象
Session.setAttribute(“name”,name);
转到web其他页面去查看商品
BuyServlet:
List cart购物车
Cart.add(good);
HttpSession session=request.getSession(false);
If(session==null){
跳转到登录的页面
} session.add(cart);
2、 isRequestedSessionIdValid方法 ------请求域中的方法,封装的sessionId
3、isRequestedSessionIdFromCookie方法 -----通过Cookie或URL方法,返回ture或false.
4、isRequestedSessionIdFromURL方法 -----通过Cookie或URL方法,返回ture或false.
六、Session域范围的属性
————————————作业:—————————————
1、Application与session域范围的属性比较
HttpSession session = request.getSession();
Integer sessionCount = (Integer)session.getAttribute("count");
int count = 0;
if(sessionCount != null)
{
count = sessionCount.intValue();
}
out.println("当前会话中发生了" + (++count) + "次访问<br>");
session.setAttribute("count",new Integer(count));
count = 0;
ServletContext application = getServletContext();
Integer applicationCount = (Integer)application.getAttribute("count");
if(applicationCount != null)
{
count = applicationCount.intValue();
}
out.println("WEB应用程序中发生了" + (++count) + "次访问<br>");
application.setAttribute("count",new Integer(count));
反应计数器的不同,
2、购物车的流程:
首页:看到所有的商品 InitServlet
Id 商品名称 价格 是否加入购物车
1 洗衣机 800 <a href=’/demo/buyServlet?id1’>加入购物车</a>
2 电视机 800 <a href=’/demo/buyServlet?id2’>加入购物车</a>
3 mp4 800 <a href=’/demo/buyServlet?id3’>加入购物车</a>
4 录音机 800 <a href=’/demo/buyServlet?id4’>加入购物车</a>
BuyServlet:
获取到要购买的商品的id,获取对应商品对象good
List cart =new LinkedList();
Cart.add(good);
Session.setAttribute(cart);需要判定
跳转到显示购物车的页