会话跟踪之Session与Cookie

引言:http 协议是无状态协议,即WEB服务器本身不能识别出哪些请求是同一浏览器发出的,浏览器的每一次请求都是孤立的。即使 http1.1 支持持续连接,但用户有一段时间没有提交请求,连接也会关闭。作为服务器,必须能够采用一种机制来唯一地标识一个用户,同时记录该用户的状态
两种机制完成会话跟踪:Cookie、Session

Cookie

含义:完成会话跟踪的一种机制,客户端保持 http 状态信息的方案

原理:一旦WEB浏览器保存了某cookie,以后每次访问服务器,都会在Http请求头中将这个Cookie回传给Web服务器

底层实现:服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给服务器

1.传送机制示意图
在这里插入图片描述
2. 会话cookie和持久cookie

默认是一个会话级别,存储在浏览器内存,退出浏览器后被删除,可通过setMaxAge(x)设置时效,单位为秒
x=0表明命令浏览器删除该cookie
x<0表示不存储该Cookie
x>0表示客户端将cookie保存时间

3.作用范围

默认当前目录和当前目录的子目录,不能作用于当前目录的上一级目录
设置Cookie作用范围解决此问题cookie.setPath(request.getContextPath());
request.getContextPath()表示为当前web应用的目录

4.应用场景

自动登录(在一定时间内免登录,密码进行加密)
利用cookie显示最近浏览过的商品

注: 一个Cookie只能标识一种信息,即一个key、value
web浏览器一般允许存放300,每个站点存放20,大小限制4KB
对于持久Cookie,因cookie保存在硬盘上,浏览器的不同进程间共享

Session

含义:服务器端保持Http状态信息的方案(类似于散列表的结构)

原理:客户端请求未带JSESSIONID(Cookie中没有或未进行URL重写),服务器会新建一个session,并且生成一个与此session相关联的sessionId,这个sessionid将在本次响应中返回给客户端保存;否则服务器就按照sessionid把这个session检索出来使用

1.传送机制示意图
在这里插入图片描述
2.session生命周期

  • HttpSession对象的创建
    浏览器是否访问任何一个 jsp 或 Servlet,服务器都会立即创建此对象?
    不一定

客户端首次访问web服务器的 jsp 页面,且 jsp 首部将session指定值为flase,则服务器此次就不会创建session对象
若客户端访问jsp页面时,其他页面已经创建了session对象,则当前 jsp 页面会返回已创建的 session 对象

客户端首次访问web服务器的 Servlet,且只有调用了request.getSession( )时才会创建session对象

  • HttpSession对象的销毁

使当前的 session 对象失效 session.invalidate()
服务器卸载了web应用
session的过期(默认1800秒,即半小时),通过调用方法或者 web.xml 中设置session的过期时间

3.sessionid的保存方式(JSESSIONID)

一般采用 cookie,这样在交互过程中浏览器可 自动的 按照规则把这个标识发送给服务器
URL重写,把 sessionid 附加在url 的路径后边,一种是作为 url 路径的附加信息,另一种是作为查询字符串附加在URL后边

4.相关API

获取sessionid、isNew、最大时效、创建时间、上次访问时间 、设置获取属性

  • request.getSession(boolean creat)

creat 为 false
  若没有和当前页面关联的HttpSession对象,则返回null;若有,返回session
Creat为true
  一定返回一个对象,若没有,则新建,若有则返回Session

5.jsp 页面首部设置session=“false",

功能:使当前页面禁用 session 隐含变量,但可以使用显式的HttpSession对象
session = request.getSession( false );

问题:用户人为地在Session后添加一个JSESSIONID

6.Session cookie

含义:默认使用cookie来实现,系统会创造一个名为 JSESSIONID 的cookie,称之为 session cookie
注:其是存储在浏览器内存中的,并未写到硬盘上,即针对某一次会话而言,会话结束后session cookie也就随着消失了,需要手动持久化session cookie( JSESSIONID )才可保证关闭浏览器重新打开后 sessionid 相同,即设置cookie的过期时间

7.应用场景

重新登陆和网站注销

8.Cookie禁用后session怎么用

利用URL重写实现Session跟踪
response.encodeUrl(“login.jsp”),系统会自动在url后拼接上JSESSIONID

注:session是否可用由对象本身及JSESSIONID决定 cookie被禁用并且未进行URL重写则每次都会创建新session
原因:客户端每次过去都未携带JSESSIONID

Cookie与Session的区别

数据存放位置、安全程度、性能使用程度、数据存储大小

性能:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie

存储大小:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储在服务端,对其没有限制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值