会话管理–Cookie(客户端)
- 为什么会出现cookie
1.WEB应用程序是基于HTTP协议
2.HTTP基于请求/响应模式
(所有的请求都是相互独立的,无连续的)
3.HTTP是无连接的协议
(限制每次连接只处理一次请求/响应)
4.HTTP是无状态的协议
(协议对于事务处理没有记忆能力)
- 会话管理的产生
对于需要客户端和服务器端多次交互的网络应用,则必须记住客户端状态
- 会话管理概念
会话就是一个客户端连续不断地和服务器端进行请求/响应的一系列交互。
多次请求间建立关联的方式称为会话管理,或会话跟踪。
会话状态,指服务器与浏览器在会话过程中产生的状态信息。
- 会话管理的产生
1.当服务器接受客户端的首次请求时,服务器初始化一个会话并分配给该回话一个唯一标识符
2.在以后的请求中,客户端必须将唯一标识符包含在请求中,服务器根据此标识符将请求与对应的会话联系起来
-
会话管理:使用cookie
-
所有的HTTP消息,不管是请求还是响应均包含头信息
1.当服务器返回响应给客户单时,Servlet容器会把绘画的信息添加到响应头信息中
2.客户端浏览器接受到响应提取头信息,并将其存储在其本地机中,以后发送请求时会自动将信息待会服务器端
-
浏览器存储在客户端机器上的头信息称作Cookie,它以“属性名=属性值; …”方式组成文本信息
-
创建并向客户端发送cookie,cookie的常用方法
1.创建cookie对象(调用构造方法,给出名称和值)
Cookie c=new Cookie("userName","a1234");
2.设置最大时效(单位是秒)
(如果要告诉浏览器将cookie存储在磁盘上
如果值为0,表示删除对应的cookie
如果值为负数,表示cookie只适用于当前的浏览会话
默认值为-1)
c.setMaxAge(60*60*24*7);
3.将cookie放入到HTTP响应中
response.addCookie(c);
4.调用request.getCookies
得到Cookie对象组成的数组
5.循环数组,调用每个对象的getName找到想要的cookie
6.根据应用程序调用getValue方法使用这个Cookie
- cookie的优缺点
优点:
1.可以配置到期规则,数据可持久保存
2.不需要服务器资源,数据保存在客户端
3.简单性,基于文本的key-value对
缺点:
1.大小受到限制(总数300;20/站点;4KB/Cookie)
2.用户可禁用客户端接收Cookie功能
3.潜在的安全风险
会话管理–Session(服务器)
在Servlet中进行会话管理,可以使用HttpServletRquest的getSession()方法获取HttpSession对象(简称Session),通过设置/获取服务器端Session对象的属性,来保留请求之间的相关信息
- 获取HttpSession对象,设置相关属性
HttpSession session = req.getSession();
session.setAttribute("userName", userName);
- 获取HttpSession对象,取出相关属性
HttpSession session = req.getSession();
session.getAttribute("username”);
- 通常分三个步骤/
1.获取一个与请求相关联的会话
HttpSession session = request.getSession();
2.从Session中设置或获取一个属性
session.setAttribute(“userName”,userName);
session.getAttribute(“username”);
3.根据需要关闭会话
session.invalidate();
通常客户端不提供结束会话的通知,而是Servlet容器在用户处于一段非活动期后就会自动的使会话失效——这个时间段称为会话的超时期
Session对象失效:当用户超出指定会话期时间处于非活动状态时,会话自动结束
setMaxInactiveInterval(),设置会话的超时期
通过web.xml的<session-timeout>标签设置
使用方法invalidate()
- session的方法
1.getAttribute()
从会话对象中提取出一个之前存储的属性值
如果没有找到与名称相关联的值,则返回null
2.setAttribute()
设置会话对象的属性名称和属性值
3.removeAttribute()
移除与名称关联的值
4.getAttributeNames()
返回会话中所有属性的名称
5.getId()
返回唯一的标识符
7.isNew()
确定会话对于客户来说是否为新创建
8.getCreationTime()
返回会话创建的时间
9.getLastAccessedTime()
返回客户端最近一次发送请求的时间
10.getMaxInactiveInterval()、setMaxInactiveInterval()
取得或设置会话的超时期
11.invalidate()
废弃当前的会话