一、会话概述
在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话。
Web应用中的会话过程类似与生活中的打电话过程,他指的是客户端(浏览器)与服务器之间连续一系列请求和响应的过程,例如:户到某购物网站购买商品,这时用户会和网站之间发生多次的请求响应,整个购物的过程称为会话.
在打电话的过程中,通信双方会有通话内容,同样,在客户端和服务端交互的过程中,也会产生一些数据。
例如,用户甲和用户乙分别登录了购物网站,甲购买了一个小米手机,乙购买了一个iPad,当这两个用户结账时,Web服务器需要对用户甲和用户乙的信息分别保存。
在以前讲的知识中,HttpServletRequest和ServletConext对象都可以对数据进行保存,但是这两个对象都不行,具体原因如下:
(1)客户端请求web服务器时,针对每次的Http请求,Web服务器都会创建一个HttpServletRequest对象,该对象只能保存本次请求所传递的数据。由于购买和结账是两个不同的请求,因此,在发送结账请求时,之前购买请求中的数据将会丢失。
(2)使用ServletContext对象保存数据时,由于同一个web应用(项目)共享同一个ServletContext对象,因此,当用户进行结账请求时,由于无法区分哪个商品是哪个用户购买的,而是将该购物网站的所有用户购买的商品进行结算,这显然是不行的。
为了保存会话过程中产生的数据,在servlet技术中,提供了两个用于保存会话数据的对象分别是cookie和session。
二、Cookie介绍&Cookie案例
2.1.Cookie和Session技术概述
用户打开浏览器开始访问服务器,在一系列的访问过程中,把用户的这些操作称为用户和服务器的之间的对话(客户端和服务器的会话)。
在交互的过程中,用户的一系列操作,肯定会产生一些数据需要保存。这时就需要使用Java提供的Cookie或者Session技术来完成。
cookie的典型应用是:
判断用户是否登陆过网站,以便下次登录时能够直接登录。如果我们删除cookie,则每次登录必须从新填写登录的相关信息。
Cookie技术在实际网站中的工作原理:
Cookie:它是服务器在获取到用户的请求之后,把用户的请求中的重要资源保存在这个对象中,在给用户响应的时候,把这个对象的发给客户端。然后浏览器接收到这个Cookie之后,浏览器会自动的把Cookie中的数据保存到浏览器管理的缓存中,下次用户在访问这个网站的时候,浏览器就会自动携带上次保存的Cookie中的数据到服务器,服务器进而就能获取到以前的信息。
2.2.Cookie的API介绍
2.2.1.创建Cookie
创建一个 cookie,cookie 是 servlet 发送到 Web 浏览器的少量信息,这些信息由浏览器保存,然后发送回服务器。cookie 的值可以唯一地标识客户端,因此 cookie 常用于会话管理。
一个 cookie 拥有一个名称、一个值和一些可选属性,比如注释、路径和域限定符、最大生存时间和版本号。一些 Web 浏览器在处理可选属性方面存在 bug,因此有节制地使用这些属性可提高 servlet 的互操作性。
servlet 通过使用HttpServletResponse#addCookie方法将 cookie 发送到浏览器,该方法将字段添加到 HTTP 响应头。
通过Cookie的构造函数,告诉我们在服务器给响应数据的时候,如果要发送一个Cookie对象,这时需要在服务器先创建一个Cookie对象,而这个Cookie中保存的数据由key和value组成。
当浏览器下次再访问服务器的时候,就会携带这个Cookie对象到服务器,服务器就会获取到当前这个Cookie对象,然后需要通过这个key,找出value值。
需要把浏览器cookie发送给浏览器,需要借助response对象完成
response.addCookie(Cookie对象);
初次访问(debug追踪):
在响应中有cookie,在请求头中没有cookie的信息
第二次访问:
2.2.2.获取Cookie
在客户端访问servlet的时候,首先在servlet中先判断当前用户有没有携带cookie数据
如果有,我们就可以获取这个cookie数据;
如果没有,我们就在程序中创建一个cookie给用户写到客户端。
下次用户访问的时候一定会携带Cookie到服务器。
获取请求中的cookie需要使用request对象。
request对象中的getCookies获取到一个cookie数组,因此一个Servlet可以同时发送给客户端多个Cookie对象。
首次浏览器访问:
第二次访问:
2.2.3.Cookie分类
1、
临时会话级别的Cookie
服务器给客户端发送的Cookie,如果没有指定Cookie在客户端的保存时间,这时这个Cookie只会在浏览器运行的期间存在;
当浏览器关闭之后,客户端中的Cookie随着浏览器的关闭就消失了。
2、持久化的Cookie
在服务器给客户端发送Cookie的时候,可以指定Cookie在客户端的存活时间。
注意:这里的时间值不要太大
2.2.4.设置路径(难点)
问题1:访问服务器的每一个路径都携带cookie数据这样合理吗?
问题2:cookie的默认路径是什么? 有什么根据?
如果创建某个cookie属性没有设置path属性,那么该cookie只对当前访问路径所属的目录及其子目录有效。
假设:访问/day11/cookie1,他的目录是/day11,子目录是/day11/xxx/yyy....,均有效 会携带cookie
假设:访问/day11/aaa/bbb/ccc/cookie1,他的目录是/day11/aaa/bbb/ccc,子目录是:/day11/aaa/bbb/ccc/xxx/yyy/....,均会携带cookie
如果想让某个cookie项对站点的所有访问路径都有效,就调用:cookie.setPath("/")/表示http://ip:端口
2.2.5.Cookie的有效域名(了解)
设置当前这个Cookie在哪个域名下有效。一般的浏览器都不支持接受不是当前域名下的Cookie。
如果把cookie的域名设置成其他的域名,而不是当前这个资源的域名,
这个cookie被称为第三方Cookie,几乎所有的浏览器默认不支持第三方Cookie。
注意:不要设置他
2.2.6.删除Cookie
1、将cookie的name(key)保持一致,value设置为"";
cookie = new Cookie("username","")
2、设置存活时间为0,
cookie.setMaxAge(0)
3、路径要发送cookie时保持一致。
cookie.setPath("/");
4、将cookie发送给浏览器。
response.addCookie(cookie)
2.3.cookie案例:显示用户上次访问的时间
当用户访问某些web应用的时候,经常会显示出上次的访问时间。
例如:QQ登录成功后,会显示用户上次的登录时间。
1、向浏览器发送cookie
2、从cookie中获取上次访问的时间
3根据上次访问时间的内容,给浏览器显示对应的内容
首次访问对应的servlet
第N(>1)次访问:
整体代码: