WEB开发——会话与状态管理(Cookie、Session )

概念:

●  HTTP协议是一种无状态的协议
●  服务器本身不能识别出请求是否是同一个浏览器发出(每一次请求都是完全孤立的)
●  作为web服务器,必须能够采用一种机制来唯一地标识一个用户,同时记录该用户的状态
------------------------------------------------------------------------------------------------------------------

会话、会话状态和会话跟踪:

●  会话:客户端与服务器之间发生的一系列请求和响应过程

●   会话状态 :服务器与浏览器在会话过程中产生的状态信息

●  会话跟踪:发送请求消息时附带的标识号,称之为会话ID(SessionID)

注意:在Servlet规范中,常用Cookie、Session机制完成会话跟踪

------------------------------------------------------------------------------------------------------------------
Cookie机制: 在客户端以文本文件方式保存HTTP状态信息
●  一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称和设置值
●  每次访问时,都会在HTTP请求头中将这个保存的Cookie回传给WEB服务器
●  一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个Cookie
注意:浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB
------------------------------------------------------------------------------------------------------------------
在Servlet程序中使用Cookie:

注意:setMaxAge()方法未设置,则表示为会话cookie。随着浏览器的关闭,声命周期消失,一般保存在内存里。如果设置了,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。如果在Cookie的value上存储中文,那么需要使用URLEncoder.encode(value,字符集编码),取出中文值时也需要进行解码:URLDecoder.decode(value,字符集编码)
------------------------------------------------------------------------------------------------------------------
Session机制: 在服务器端保持HTTP状态信息的方案
●  服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息
●  session通过SessionID来区分不同的客户, session是以cookie或URL重写为基础的
●  默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,这称之为session cookie,以区别persistent cookies(也就是我们通常所说的cookie),session cookie是存储于浏览器内存中的,并不是写到硬盘上的,通常看不到JSESSIONID,但是当把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid,这时地址栏看到
●  session cookie针对一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie只是存在于客户端硬盘上的一段文本
●  关闭浏览器,只会是浏览器端内存里的session cookie消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化cookie消失
------------------------------------------------------------------------------------------------------------------
Session的创建与删除:
创建:
●  程序调用getSession()方法时(客户端有访问时session不被创建)
删除:
●  程序调用invalidate()
●  时间间隔超过了session的最大有效时间
●  服务器进程被停止
注意:关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。浏览器开多个窗口访问应用程序会使用同一个session 
------------------------------------------------------------------------------------------------------------------
HttpServletRequest接口中的Session方法:
getSession():
●  如果当前这次会话中不包含有session对象存在,则会在服务器端构建一个session对象并返回给客户端
●  如果当前这次请求中包含有session对象则,把该session对象返回
getSession(boolean):
●  传入false,在当前的会话中查找是否有session对象,有则返回这个session对象,没有则返回null
●  传入true,在当前的会话中不包含有session对象存在,则会在服务器端构建一个session对象并返回给客户端
●  如果当前这次会话中包含有session对象则,把该session对象返回
注意:在JSP页面中如果在page指令上设置了session=“false”,表示禁止使用JSP页面的session隐含对象。但是可以人为的构建session
------------------------------------------------------------------------------------------------------------------
HttpSession接口中的方法:(session是HttpSession的对象)
●  getId( ) :返回当前浏览器与服务器之间会话的标识符
●  getCreationTime( ) :返回创建时间(long型值。1970年1月1日至今的毫秒数)
●  getLastAccessedTime( ) :返回上一次访问时间(浏览器与服务器之间进行会话之后,session的最大存活时间重新开始计算。long型值。1970年1月1日至今的毫秒数)
●  setMaxInactiveInterval(long  seconds) :设置session的最大存活时间(浏览器与服务器超过设置的时间未进行会话,则该session会被销毁掉。秒为单位)
●  getMaxInactiveInterval( ) :返回session的最大存活时间(超过最大存活时间,session对象失效。秒为单位)
●  isNew( ) :判断当前的session是否是新的
●  invalidate( ) :把当前session对象设置为无效,session中的任何属性不能被访问到。但是session对象还存在
●  setAttribute(String  name,Object  value) :向session对象中添加属性和属性值,属性名存在,则会覆盖对应的属性值
●  getAttribute(String  name) :通过属性名来获得在session对象中存放的属性值,如果没有找到返回null
●  removeAttribute(String  name) :移除指定的属性名的session对象
●  getAttributeNames( ) :返回所有的属性名
------------------------------------------------------------------------------------------------------------------
Session的超时管理:
●  WEB服务器无法判断当前的客户端浏览器是否还会继续访问,也无法检测客户端浏览器是否关闭,所以,即使客户已经离开或关闭了浏览器,WEB服务器还要保留与之对应的HttpSession对象
●  WEB服务器采用“超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间之内没有发出后续请求,WEB服务器则认为客户端已经停止了活动,结束与该客户端的会话并将与之对应的HttpSession对象变成垃圾
●  如果客户端浏览器超时后再次发出访问请求,WEB服务器则认为这是一个新的会话的开始,将为之创建新的HttpSession对象和分配新的会话标识号
●  会话的超时间隔可以在web.xml文件中自定义设置,其默认值由Servlet容器定义(tomcat)(单位分钟)

------------------------------------------------------------------------------------------------------------------
自己整理,有些地方是扒拉的,如有侵犯,还望告知
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值