Session和Cookie状态管理技术
目录
1,背景
Cookie:HTTP通信协议理解为“无状态”的,而web应用程序使用HTTP通信协议,即服务器一旦响应完客户的请求之后就会断开连接,当下次同一个客户再次请求时需要重新建立连接。
Session:有时候,客户会多次发出请求,服务器需要判断是否为同一个客户发出的请求。
2,概念
把浏览器与服务器之间的多次交互当成一个整体,并且把交互涉及的数据保存下来。交互:请求-响应。数据:状态。管理:多次交互时对数据的修改管理。分为 客户端状态管理技术/服务器状态管理技术。
3,原理
Cookie:浏览器向服务器发送请求,服务器将少量的数据以set-cookie消息头的方式发送给浏览器,浏览器把这些数据保存下来。当浏览器再次访问服务器时候,会把这些数据以cookie消息头的方式发送给服务器。
Session:浏览器访问服务器时,服务器会为每一个浏览器分配空间在服务端内存中,每个都单独创建一个session对象,该对象有一个id属性,其值唯一,称sessionId。并且服务器会这个id发送给浏览器。这是为了当浏览器再次访问服务器时,将id发送给服务器,服务器通过id找到对应session的位置。
4,创建
cookie
Cookie c = new Cookie(String name,String value);
response.addCookie(c);
session
(1) HttpSession s = request.getSession();
(2)HttpSession s = request.getSession(boolean flag);
HttpSession是一个接口,后面返回的是符合规范的对象。当flag为true时,首先查看浏览器请求中有没有sessionid,如果没有,服务器就创建一个对象;如果有,就根据id找到对象后返回,找不到就创建一个新的再返回。当为true时,一定能返回一个session对象。而当flag为false时,没有id或者(有id)但没对象,返回null,找到的话就返回。
5,查询
cookie
Cookie[ ] request.getCookies();//获取所有的cookie对象
String Cookie.getName();//获取一个对象的名称
String Cookie.getValue();//值
6,绑定session对象
void Session.setAttribute(String name,Object obj); // 绑定
Object Session.getAttribute(String name); // 获取
void Session.removeAttribute(String name); // 移除
Session.invalidate(); // 立即删除
7,修改cookie
获取客户端发送的所有cookie-->根据name找到要修改的cookie-->调用cookie的setValue()方法修改-->将修改后的cookie添加到response发送给客户端
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for(Cookie c:cookies){
String name = c.getName();
if(name.equals("city")){
//同名cookie会覆盖
c.setValue("GuangZhou");
response.addCookie(c);
}
}
}
8,cookie生存时间
浏览器将cookie保存至内存缓存中,关闭即消失;如果不希望关闭就消失,可以设置过期时间(void Cookie.setMaxAge(int seconds))。
9,session和cookie的区别
(1)session是保存至服务的,客户无法知道其中的信息,安全;cookie保存至浏览器
(2)session保存是对象,cookie保存是字符串
(3)session不区分路径,同一用户同一网站,所有的session都通用;cookie区分路径,同一网站不同路径下的cookie互相访问不到。
(4)cookie约保存4KB数据,session可以保存更多的数据。