web会话技术 ----- cookie和session

一.会话

1.会话:一次会话中包含多次请求和相应
一次会话:浏览器第一次给服务器发送请求,会话建立,直到一方断开为止。在web应用中,作为客户端的浏览器,通过请求/响应这种模式访问同一个web网站的各种web页面,从开始访问这个服务器直到结束(任意一方断开)整个过程称为一次会话。

2.会话技术功能:在一次会话的范围内的多次请求间,共享数据

3.会话技术的分类:服务器端会话技术(session),浏览器(客户)端会话技术(cookie)

二.客户端会话技术Cookie

1.为什么要有cookie?
由于http协议是无状态的,协议无法记录相应用户的状态信息,而利用cookie会话技术便弥补这一不足。

2.什么是cookie?
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。 客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
Java中把Cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是该Cookie类的对象。服务器通过操作Cookie类对象对客户端Cookie进行操作。
通过request.getCookie()获取客户端提交的所有Cookie(以Cookie[]数组形式返回)
通过response.addCookie(Cookie cookie)向客户端设置Cookie。

3.Cookie技术中常用的方法
关于获取和发送cookie:
(1)服务器端获取cookie:request.getCookie(),以Cookie[]数组形式返回
(2)服务器端发送cookie:response.addCookie(Cookie cookie)

关于cookie的生命周期:
默认情况cookie保存在浏览器的缓存中,当我们关闭浏览器时,cookie随之被销毁
我们也可以通过相应的方法来设置cookie的生命周期:setMaxAge(int seconds)
参数为正:将cookie保存到本机硬盘中,保存的时间为设置的时间
参数为负:默认情况
参数为0:清空cookie

关于cookie的共享:
当我们我们通过request.getCookie()来获取cookie时,实际上是一种共享,对于共享那就会存在以下问题

(1)一个服务器部署多个web项目:当前的web项目肯定可以通过request.getCookie()来获取相应的cookie信息。但是其他项目是否可以访问当前的cookie 呢?默认是不可以的,但是我们可以通过cookie类中的setPath()方法来设置该属性,当我们将其设置为“/”时,其它的 web项目便可以访问cookie了
(2)不同服务器部署不同的web项:Cookie具有不可跨域名性。根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的 Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。若要实现不同服务器中的不同web项目之 前cookie的相互共享,则必须满足“一级域名相同”,通过setDomain来实现。

cookie解决中文乱码问题:
编码:URLEncoder.encode(需要编码的数据,编码的方式);
解码:URLDecoder.decoder(需要解码的数据,解码的方式);

获取cookie的键和值:
getName() 获取当前cookie对象的键
getValue() 获取当前cookie对象的值

4.cookie的特点
浏览器对于单个cookie的大小有限制,对于同一个域下的总cookie数量也有限制(一般20个以内)

5.cookie的修改删除
Cookie并不提供修改、删除操作。如果要修改某个Cookie,只需要新建一个同名的Cookie,添加到response中覆盖原来的Cookie。
如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。

三.服务器端会话技术session

1.session的基本概念
是将数据存储在服务器的技术。在一次对话的多次请求间共享数据,将数据保存在服务器端对象中。

2.session的基本方法
(1)获取HttpSession对象:request.getSession()
(2)使用session对象
Object getAttribute(String name)
void setAttribute(String name,Object value)
void removeAttribute(String name)

3.session的原理
问题的关键就在服务端如何发送这个session的唯一标识上。联系到HTTP协议,数据无非可以放到请求行、头域或Body里,基于此,一般来说会有两种常用的方式:cookie和URL重写。
在这里插入图片描述

4.session的一些常见问题
(1)当客户端关闭后,服务器不关闭,两次获取的session是否为同一个?
默认情况下不是。我们可以通过设置cookie的存活时间来改变。

(2)当客户端不关闭,服务器关闭时,两次获取的session值是否为同一个?
不是同一个。但是数据时一样的(保证数据不丢失)。

session的钝化:在服务器关闭之前,将session对象系列化到硬盘上。
session的活化:在服务器启动后.将session文件转化为内存中的session对象。
以上的两个操作,Tomcat会自动完成,不需要我们自己去做

(3)session的销毁
服务器关闭时,session会被销毁
session对象可以调用invalidate()方法完成自我销毁
Session的默认失效时间为30分钟,我们可以再web.xml文件中修改该默认值

四.session和cookie二者的异同

无论使用何种服务端技术,只要发送回的HTTP响应中包含如下形式的头,则视为服务器要求设置一个cookie:
Set-cookie:name=name;expires=date;path=path;domain=domain

支持cookie的浏览器都会对此作出反应,即创建cookie文件并保存(也可能是内存cookie),用户以后在每次发出请求时,浏览器都要判断当前所有的cookie中有没有没失效(根据expires属性判断)并且匹配了path属性的cookie信息,如果有的话,会以下面的形式加入到请求头中发回服务端:
Cookie: name=“zj”;Path="/linkage"

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值