ch08会话跟踪.docx
- 文档编号:11697162
- 上传时间:2023-03-30
- 格式:DOCX
- 页数:30
- 大小:27.17KB
ch08会话跟踪.docx
《ch08会话跟踪.docx》由会员分享,可在线阅读,更多相关《ch08会话跟踪.docx(30页珍藏版)》请在冰豆网上搜索。
ch08会话跟踪
第8章会话跟踪
会话可以看作浏览站点的整段时间。
例如,在一个在线商店中,用户是第一次访问该站点,登陆并购买了一些商品,然后退出。
这就是一个会话。
术语“会话”应用于每个用户,所以每个用户会话都跟用户在浏览站点时进行的交互有关。
与所有基于HTTP的技术一样,基于Jsp和Servlet的Web页是无状态的,每次将Web页发送到服务器时,都会重新创建Web页,每次往返过程都会丢失所有与该页和该页上的控件关联的信息。
会话跟踪是指一类用来在客户端和服务器之间保持状态的解决方案。
简单的说,当一个客户对同一Web页进行多个请求,或在多个Web页面间切换时,服务器会会保存该用户的信息。
会话跟踪有4种方式:
(1)使用Cookies
(2)重写包含额外参数的URL。
(3)建立含有数据的隐藏表单字段。
(4)使用session对象。
前三种是传统的方法,每种方法都有缺点,最后一种方法是目前最常用的方法。
8.1Cookie
Cookie用于在客户端上存储少量经常更改的信息。
这些信息与请求一起发送到服务器。
一次会话标识一个唯一的客户。
如果客户离开了网站,然后重新访问网站,网站会认出该客户是上次访问的客户。
为了协助服务器区分客户,每个客户必须在服务器上标识自己。
我们把跟踪单个客户的技术称作会话跟踪。
8.1.1什么是Cookie?
Cookie是一小段文本信息,伴随着用户请求和页面在Web服务器和浏览器之间传递。
Cookie包含每次用户访问站点时Web应用程序都可以读取的信息。
例如,如果在用户请求站点中的页面时应用程序发送给该用户的不仅仅是一个页面,还有一个包含日期和时间的Cookie,用户的浏览器在获得页面的同时还获得了该Cookie,并将它存储在用户硬盘上的某个文件夹中。
以后,如果该用户再次请求该站点中的页面,当该用户输入URL时,浏览器便会在本地硬盘上查找与该URL关联的Cookie。
如果该Cookie存在,浏览器便将该Cookie与页请求一起发送到该站点。
然后,应用程序便可以确定该用户上次访问站点的日期和时间。
你可以使用这些信息向用户显示一条消息,也可以检查到期日期。
Cookie与网站关联,而不是与特定的页面关联。
因此,无论用户请求站点中的哪一个页面,浏览器和服务器都将交换Cookie信息。
用户访问不同站点时,各个站点都可能会向用户的浏览器发送一个Cookie;浏览器会分别存储所有Cookie。
Cookie帮助网站存储有关访问者的信息。
通过Cookie为某个特定的用户自定义网页是一种使用较广的方法。
Cookie是一个文本文件,网站把该文件存储在客户端的计算机上,以追踪个人的动作和喜好。
用户第一次访问站点时,用户的计算机就可能收到包含标识客户的唯一标识符的Cookie。
以后,用户再次访问站点时,会重新激活这个Cookie,站点通过这个Cookie认出客户,并用Cookie来存储信息。
如用户在线购物或执行其它对站点发出请求任务时,服务器会收到包含用户唯一标识符的Cookie。
访问器利用这个唯一的标识符查找用户并进行相应的处理。
使用Cookie能够达到多种目的,所有这些目的都是为了帮助网站记住用户。
例如,一个实施民意测验的站点可以简单地将Cookie作为一个Boolean值,用它来指示用户的浏览器是否已参与了投票,这样用户便无法进行第二次投票。
要求用户登录的站点则可以通过Cookie来记录用户已经登录,这样用户就不必每次都输入凭据。
注意:
浏览器从Web服务器上请求某种资源时,就把上次由Web服务器发给客户端的Cookie当作请求的一部分返回Web服务器。
过期的Cookie会被删除。
8.1.2使用Cookie
任务8.1根据用户登录次数,显示不同的首页内容
当用户登录网站时,可以使用response对象的addCookie()方法将其访问的次数写到Cookie文件中并保存在客户端。
当客户端再次登录时,就可以使用request的getCookie()对象获取Cookie文件中的信息,从而判断用户是否登录过网站,如果用户没有登录过网站,则还没有建立属于网站的Cookie文件,如果在这个时候使用request对象,其返回的值将是null,所以要对request的返回值进行判断,以免发生异常致使页面无法正常显示;如果用户登录过网站,则可以使用Cookie文件记录其登录的次数。
这里有一点要注意,Cookie对象的参数值只接受字符型,而登录次数却属于整型,所以要进行数据类型的转换。
packageservlets;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjava.io.*;
publicclassIndexServletextendsHttpServlet{
publicvoidinit()throwsServletException{
}
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException
{
Cookie[]c=request.getCookies();
if(c==null)
{Stringi="0";
Cookiee=newCookie("count",i);
e.setMaxAge(60*60*24*365);
response.addCookie(e);
RequestDispatcherdispatcher=request.getRequestDispatcher("/temp");
if(dispatcher!
=null)
dispatcher.forward(request,response);
}
else
{
for(inti=0;i {Stringstr1=c[i].getName(); if(str1.equals("count")) {intj=Integer.parseInt(c[i].getValue())+1; Cookiee=newCookie("count",newInteger(j).toString()); e.setMaxAge(60*60*24*365); response.addCookie(e); //c[i].setValue(newInteger(j).toString()); if(j>3) { RequestDispatcherdispatcher=request.getRequestDispatcher("Praize.jsp"); if(dispatcher! =null) dispatcher.forward(request,response); } else { RequestDispatcherdispatcher=request.getRequestDispatcher("Default.jsp"); if(dispatcher! =null) dispatcher.forward(request,response); } } } } } publicvoiddoPost(HttpServletRequestreq,HttpServletResponseresp) throwsServletException,IOException { doGet(req,resp); } publicvoiddestroy(){ } } packageservlets; importjavax.servlet.*; importjavax.servlet.http.*; importjava.io.*; publicclassTemplateextendsHttpServlet{ publicvoidinit()throwsServletException{ } publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp) throwsServletException,IOException { req.setCharacterEncoding("GB2312"); resp.setContentType("text/html;charset=gb2312"); PrintWriterout=resp.getWriter(); out.println(""); out.println("
out.println("
out.println("");
out.println("
out.println(" out.println(" 欢迎您初次光临我们的商城! 在 out.println(" 这里您一定能找到您需要的物品。 out.println(" 如果您成为了我们的注册用户,每 out.println(" 件商品都将会给您意想不到的优惠 out.println(" 而只要您愿意,我们将送货上门! out.println(" 现在您愿意成为我们的注册用户吗? out.println(" out.println(" out.println(" out.println(" out.println(" ");
out.println("");
out.println("