什么是会话?
Web应用中的会话过程类似于生活中的打电话过程,它指的是一个客户端(浏览器)于web服务器之间连续发生的一系列请求和响应过程,例如,一个用户在某网站上的整个购物过程就是一个会话.
Cookie:
Cookie和浏览器缓存有什么区别?
共同点:浏览器缓存可以缓存任意内容(上网浏览的所有内容),cookie只是服务器需要浏览器缓存数据(浏览器缓存中的一部分).
什么是Cookie:
在web应用中,Cookie的功能类似于一张购物会员卡,当用户通过浏览器访问web浏览器时,服务器会给客户端发送一些信息,这些信息都保存在Cookie中.这样,当浏览器再次访问服务器是,都会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应.
服务器向客户端发送Cookie时,会在HTTP响应头字段中增加Set-Cookie响应头字段
一张图来描述Cookie在浏览器和服务器之间的传输过程:
上图中,描述了Cookie在浏览器和服务器之间的传输过程.当用户第一次访问服务器时,服务器会在响应消息中增加Set-Cookie头字段,将用户信息以Cookie的形式发送给浏览器.一旦用户浏览器接受了服务器发送的Cookie信息,就会将它保存在浏览器的缓冲区,这样,当浏览器后续访问该服务器时,都会在请求消息中将用户信息以Cookie的形式发送给web服务器,从而使服务器分辨出当前是由哪个用户发出的.
Cookie的基本使用:
创建Cookie:newCookie(name,value), javax.servlet.http.Cookie
将Cookie发送给浏览器:HttpServletResponse.addCokie(javax.servlet.http.Cookie)
接受浏览器所携带的所有Cookie:HttpServletRequset.getCookie()
Cookie的分类:
会话级别的Cookie:默认的,关闭了浏览器Cookie就销毁了
持久级别的Cookie:需要设置有效时长,关闭浏览器也不会销毁的Cookie
setMaxAge(intexpiry);以秒为时间,超过该时间后Cookie会自动销毁
setMaxAge(0),手动删除持久性的Cookie.(前提,path和name必须一致)
setPath(Stringuri),设置Cookie的有效路径
Cookie的唯一表示:
唯一标示:domain+path+name(类似Jav中的 包 + 类名)
domian域名,不同的网站使用的是不同的域名,cookie就不同
path路径,通过 cookie.setPath( )设置的内容
namecookie 名称,通过 new Cookie(name,….)确定的内容
如果路径和名称一样,两次addCookie(),后者将会覆盖前者
Cookie的API:
Session的概述
什么是Session:
Session技术就好比医院发给病人的就医卡和医院为每个病人保留病例档案的过程.当浏览器访问web服务器时,Sevlet容器就会创建一个Session对象和ID属性,其中,Session对象就相当于病历档案,ID就相当于就诊卡号.当客户端后续访问浏览器时,只要经标识号传递给服务器,服务器就能判断出该请求时哪个客户端发送的,从而选择与之对应的Session对象为之服务.
需要注意的是,由于客户端需要接收.记录和回送Sessio对象的ID,因此,通常情况下,Session是借助Cookie技术传递ID属性的.
上图中,用户甲和乙都调用buServlet将商品添加到购物车,调用payServlet进行商品结算.由于甲和乙购买商品的过程类似,在此,以用户甲为例进行详细说明.当用户甲访问购物网站时,服务器为甲创建了一个Session对象(相当于购物车).当甲将Nokia手机添加到购物车时,Nokia手机的信息便存放到了Session对象中.同时,服务器将Session对象的ID属性以Cookie(Set-Cookie-JSESSIONID=1111)的形式返回给甲的浏览器.当甲完成购物进行结账时,需要向服务器发送结账请求,这时,浏览器自动在请求消息头将Cookie(cooki:JSESSIONID=111)信息回送给服务器,服务器根据ID属性找到为用户甲所创建的Session对象,并将Session对象中存放的Noki手机信息取出进行结算.
Cookie和Session的选取:
Cookie是有大小的和个数的限制的.Session存到服务器的技术,没有大小和个数的限制
Cookie相对于Session来讲不安全的
如何使用Session:
PublicHttpSession getSession(Boolean create)
根据传递的参数判断是否创建HTTPSession对象,如果为true,则在相关的HTTPSession对象不存在时创建并返回HTTPSession对象,否则不创建新的HttpSession对象,而是返回个null
PublicHttpSession getSession()
相当于上个方法为true时的情况下,在相关HTTPSession对象不存在时总是创建新的HTTPSession对象.
注意事项:
实际上,Session的技术是依赖于Cookie的(通过Cookie中的JSESSIONID来区分请求是属于哪一个Session的)。
不同的浏览器会产生不同的Session
30分钟的过期时间指的是两次请求之间的间隔,不是总的时长。
JSESSIONID没有有效期,所以关闭浏览器则JSESSIONID的Cookie消失,也就是说,如果在访问某网站时,关闭了浏览器,再次打开同一个浏览器,且没有超过30分钟,也会产生新的Session。原生的浏览器是这样,国产浏览器能把之前的JSESSIONID续上。
如果某个浏览器发送了请求后没有再发送新的请求,则此浏览器所对应的Session在服务器内存中还会存在30分钟。直到过期销毁。
Servlet三个作用域总结:
ServletContext:针对一个WEB应用.一个WEB应用只有一个ServletContext对象,使用该对象保存的数据在整个WEB应用中都有效.
创建:服务器启动的时候
销毁:服务器关闭时候或者项目移除的时候
HTTPSession:针对一次会话.使用该对象保存数据,一次会话(多次请求)内数据有效.
创建:服务器第一次调用getSession()的时候,服务器创建session的对象
销毁:
1,非正常关闭服务器(正常关闭:session被序列化)
2,session过期了,默认时间是30分钟(可以修改,在xml配置文件中,很少用)
3,手动调用session的invalidate的方法
HttpServletRequset:针对一次请求.使用该对象保存数据,一次请求(一个页面,如果是请求转发多个页面)内数据有效
创建:客户端向服务器发送一次请求
销毁:服务器为这次请求做出响应之后,销毁request
三个作用域对象操作的API相同
存放数据:setAttribute(name,value):void
获得数据:getAttribute(name):Object
删除数据:removeAttribute(name):void
getAttributeNames():Enumeration