相关标签:
Web
Cookie
会话技术
- 本质:浏览器和服务器存储数据来弥补HTTP协议无状态的不足
- 主要分类
- Cookie (数据保存在客户端)
- Session (数据保存在服务器端)
Cookie的技术的使用
- Cookie
- 以头的方式进行浏览器和服务器之间的数据交换
- 本质是一个键值对,键和值的类型都是String
- 创建
Cookie cookie = new Cookie(String name,String value); //创建一个名称为name,值为value的Cookie对象
- 服务器写回Cookie
response.addCookie(Cookie cookie); //向客户端存储一个cookie对象,名称相同则会覆盖
- 服务器获得客户端请求中携带的Cookie
Cookie[] request.getCookies() //返回请求中携带的Cookie
Cookie常用API的介绍和分类
- 常用API
String getName() //获取Cookie对象的名称 String getValue() //获取Cookie对象的值 void detPath(String path) //设置Cookie对象的有效路径 void setMaxAge(int maxAge); //设置Cookie对象的有效时长,以秒为单位 void setDomain(String domain); //设置Cookie对象的有效域名 void setHttpOnly(boolean flag); //设置Cookie只能被HTTP协议访问(前端document对象无法获取),防止跨站点(xss)攻击
- 分类
- 会话级别
- Cookie默认即为会话级别,信息保存在浏览器的内存中,关闭浏览器后就会消失
- 持久级别
- 使用Cookie的setMaxAge()方法设置一个有效时长,信息保存在浏览器的磁盘中,关闭浏览器后不会消失
- 持久级别Cookie的清除
- 利用Cookie的setPath(String path)方法,设置一个和之前设置持久化cookie的path一致的Cookie对象
- 调用setMaxAge(0)消除
- 会话级别
Session
Session与Cookie的区别
- Cookie大小和个数具有限制
- Session的大小和个数没有限制
Session执行原理
- 将Cookie作为一个查找服务器端数据的索引
- 实现过程
- 首次请求
- 服务器端开辟空间,分配SessionID
- 利用Cookie传回SessionID
- 第二次请求
- 服务器根据Cookie中保存的SessionID找到开辟的内存空间
- 首次请求
- 代码范例:
- HttpSession session = request.getSession();
┕ 去找请求中Cookie的JSESSIONID的值 ┕ 找得到:拿去JSESSIONID进行下一步 ┕ 找不到:在服务器内存中开辟一块session区域,并给以标识(JESSIONID)存到Cookie中 ┕ 根据JSESSIONID的值找服务器的内存中对应的session区域 ┕ 找得到:return此session区域 ┕ 找不到:在服务器内存中开辟一块session区域并return
- Object value = session.getAttribute(“test”);
获取session中保存的键为test所对应的值 无test键则返回null
- session.setAttribute(“test”,”attribute”);
在session中保存值(键值对的形式)
- HttpSession session = request.getSession();
常用API
HttpSession getSession(boolean flag)
//HttpServletRequest对象的方法,用于获取Session对象,传入参数为true时必然会返回一个session对象,为false时,通过JSESSIONID找不到session时则返回null
Object getAttribute() //获取session中保存的值
void setAttribute(String key,Object value) //将数据以String=Object键值对的形式存入session中
boolean navigator.cookieEnabled //JS对象的方法,用于判断用户的浏览器是否开启了Cookie
void invalidate() //用于销毁session对象,通常在注销功能中使用
Session域功能
- 作用范围
- 与JSESSIONID相同,默认为一次会话
- 创建时机
- 通过sessionid找不到之前开辟的session区域时
- 销毁时机
- 服务器非正常关闭,==服务器正常关闭session会序列化到硬盘==
- session过期:(默认过期时间为30分钟)
- 手动调用session.invalidate();
Session默认有效期的设置
- 在web.xml中可以设置该项目的Session对象的默认有效时长
conf/web.xml ==> 作用在该服务器的所有项目中的session <session-config> <session-timeout>30</session-timeout> </session-config> 项目下的/web.xml ==> 设置当前项目的Session对象默认有效时长 <session-config> <session-timeout>30</session-timeout> </session-config> 数字的单位为分钟
单点登录
- 概念
- 分布式系统中,在一个系统登录成功以后,在其他系统间可以共享用户的登录信息
- 关键问题:Session无法跨服务器共享
- 解决思路
- Session广播
- 服务器之间通过广播的方式共享Session
- 缺点:占用内网带宽,可能产生网络风暴,集群规模大时尤为明显
- IP_Hash
- 进行负载均衡时,根据IP分配访问的服务器(同一IP始终访问同一台服务器)
- 缺点:会导致服务器的性能下降
- 第三方中间键模拟Session
- 通过Redis来模拟Session
- 缺点:引入中间键,系统复杂度提高,维护更为繁琐
- Session广播