一. 为什么需要状态管理
-Web应用程序使用Http协议通信,而Http协议是"无状态"协议,即服务器一旦响应完客户的请求之后,就断开连接,而同一个客户的下一次请求将重新建立网络连接.
-服务器应用程序有时是需要判断是否为同一个客户发出的请求,比如客户的多次选购商品.因此,有必要跟踪同一个客户发出的一系列请求.
二. 状态管理
--将客户端(浏览器)与服务器之间多次交互(一次请求,一次响应)当作一个整体看待,并且将多次交互所涉及的数据即状态保存下来.
--状态指的就是数据.
--管理指的多次交互时对数据的修改.
--常见模式:1.客户端状态管理技术:Cookie技术,保存在客户端
2.服务器状态管理技术:Session技术,保存在服务器端
三.Cookie
- 创建cookie:
Cookie c1=new Cookie(“uname”,”Kitty”); - 添加cookie到response
response.addCookie(c1); - 获取cookie
Cookie[] cookies=request.getCookies();
if(cookies!=null){
for(Cookie c:cookies){
String name=c.getName();
String value=c.getValue();
out.println(name+”“+value)
}
}else{out.println(“无cookie信息”)} - Cookie的保存时间
使用setMaxAge方法设置,单位是秒
seconds>0:保存在硬盘上的时间
seconds=0:立即删除
seconds<0:默认,保存在浏览器的内存中
四 Session
什么是Session(会话)
-浏览器访问Web服务器时,服务器会为每一个浏览器在服务器端的内存中分配空间,单独创建一个Session对象,该对象有一个Id属性,其值唯一,一般称之为SessionId,并且服务器会将这个SessionId(使用Cookie的方式)发送给浏览器,浏览器再次访问服务器时,会将SessionId发送给服务器,服务器可以依据SessionId找到对应Session对象.获得Session
HttpSession s=request.getSession(boolean true)
-HttpSession是个接口,后面返回的是符合接口规范的对象
-当flag为true时,不管有没有SessionId,一定能得到一个Session对象(没有会创建)
-当flag为false时,没有返回null;找到则返回- 使用Session绑定对象
绑定对象:
void Session.setAttribute(String name,Object obj)
获取绑定对象:
Object Session.getAttribute(String name);
解除绑定对象:
void Session.removeAttribute(String name); Session验证
-用户访问需要保护的资源时,可以使用Session验证的方法来保证其安全性,比如要求登录才能访问的资源
-实现Session验证,遵循以下步骤
-1.使用Session.setAttribute()绑定数据
-2.使用Session.getAttribute()方式读取绑定值,如果没有,跳转到登录页面Session的优缺点
a.优点:
-安全(将状态保存在服务器端)
-Session能够保存的数据类型更丰富,Cookie只能保存字符串
-Session能够保存更多数据,Cookie大约保存4k
b.缺点:
-Session将状态保存在服务器端,占用服务器资源,如果用户量过大,会影响服务器性能.