cookies 和session
1.cookie是什么
Cookie: “客户端会话技术”,将数据保存到客户端,以后"每次请求都携带Cookie数据进行访问"
2.为什么要使用cookie
-
“web程序是使用HTTP协议传输的”,而HTTP协议是"无状态的协议",“对于事务处理没有记忆能力”
“缺少状态意味着如果后续处理需要前面的信息,则它必须重传”,这样可能导致每次连接传送的数据量增大
另一方面,如果服务器不需要获取之前的信息的时候它的应答就较快
-
“使用cookie可以解决这个问题,实现数据的共享”
3.cookie什么时候产生?
-
客户端向服务器端发送一个请求时,服务端向客户端发送一个Cookie然后浏览器将Cookie保存
-
Cookie有两种保存方式:
1.Cookie保存在内存中
2.保存在客户端的硬盘中, 之后每次HTTP请求浏览器都会将Cookie发送给服务器端
4.cookie的工作原理
- 浏览器端第一次发送请求到服务器端
- “服务器端创建Cookie”,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端
- 浏览器端"再次访问服务器端"时会"携带服务器端创建的Cookie"
- 服务器端"通过Cookie中携带的数据区分不同的用户"
5.cookie的基本使用
- 发送 Cookie
创建Cookie对象,设置数据
Cookie cookie = new Cookie("key","value"); //键值
发送Cookie到客户端:使用response对象
response.addCookie(cookie);
- 获取 Cookie
获取客户端携带的所有Cookie,使用request对象
Cookie[] cookies = request.getCookies();
1.遍历数组,获取每一个Cookie对象: for
2.使用Cookie对象方法获取数据
cookie.getName(); //获取键
cookie.getValue(); //获取值
6.cookie的缺点
-
“数量受到限制”:
单个cookie保存的数据<=4KB,一个站点一般保存20~50个Cookie
(不同浏览器不一样,Sarafi和Chrome对每个域的Cookie数目没有严格限制)
-
“是不安全的”:
cookie对客户端是可见的,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,
所以它是不安全的
-
“浏览器可以禁用Cookie”,禁用Cookie后,也就无法享有Cookie带来的方便
7.cookie的使用场景
1.对安全性要求不高
2.不需要大量数据
session
1.session是什么
* Session: "服务端会话跟踪技术,将数据保存到服务端"
JavaEE 提供 "HttpSession接口", 来实现"一次会话的多次请求间数据共享功能"
2.session的基本使用
* request.getSession(); //获取Session对象
* Session对象功能
* void setAttribute(String name, Object o): "存储数据到 session 域中"
* Object getAttribute(String name) : 根据 key,"获取值"
* void removeAttribute(String name): 根据 key,"删除该键值对"
3.session的工作原理
1. 浏览器端第一次发送请求到服务器端,服务器端创建一个Session
同时会创建一个特殊的Cookie(name为JSESSIONID的固定值,value为session对象的ID)
然后将该Cookie发送至浏览器端
2.浏览器端发送第N次请求到服务器端,浏览器端访问服务器端时就会携带该name为JSESSIONID的Cookie对象
3.服务器端根据name为JSESSIONID的Cookie的value(sessionId),去查询Session对象,从而区分不同用户
4.session 活化
* 服务器重启后,Session中的数据是否还在?
* 钝化: 在"服务器正常关闭后" , "Tomcat自动将 Session数据写入硬盘的文件中"
* 活化: "再次启动服务器后", 从"文件中加载数据到Session中"
session 和cookie 的区别
1.存储位置不同
* "Cookie"的数据信息存放在"客户端浏览器"上;
* "Session"的数据信息存放在"服务器"上;
2.存储容量不同
* "单个Cookie保存的数据<=4KB,一个站点一般保存20~50个Cookie"(不同浏览器不一样,Sarafi和Chrome对每个域的Cookie数目没有严格限制)
* 对于Session来说并"没有上限",但出于对服务器端的性能考虑,Session内不要存放过多的东西,并且设置Session删除机制 (或者采用缓存技术代替session)
3.存储方式不同
* Cookie中"只能保管ASCII字符串",并需要通过编码方式存储为Unicode字符或者二进制数据
* Session中能够"存储任何类型的数据" ,包括且不限于string,integer,list,map等
4.安全性不同
* "Cookie对客户端是可见的",别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它是"不安全"的
* "Session存储在服务器上,不存在敏感信息泄漏的风险"
5.存储时间不同
* Cookie默认浏览器关闭
* Session 默认30分钟
* 开发可以通过设置cookie的属性,达到使cookie长期有效的效果。
* session依赖于名为JSESSIONID的cookie,而cookie JSESSIONID的过期时间默认为-1,
只需关闭窗口该session就会失效,因而session不能达到长期有效的效果
6.服务器压力不同
* Cookie保管在客户端,"不占用服务器资源", "对于并发用户十分多的网站,cookie是很好的选择"(Cookie不占用服务器资源)
* session是保管在服务器端的,每个用户都会产生一个session, 假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存(Session 占用服务器资源)
7.键值对数量不同
* Cookie 存一个键和一个值
* Session 存n个键和值
/*
Cookie 和 Session 都是来完成一次会话内多次请求间数据共享的
*/