深入Cookie与Session的区别与原理
Cookie与Session区别:
- 作用范围不同,Cookie 保存在客户端(浏览器),Session 保存在服务器端。
- 有效期不同,Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭或者 Session 超时都会失效。
- 隐私策略不同,Cookie 存储在客户端,比较容易遭到不法获取,早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取;Session 存储在服务端,安全性相对 Cookie 要好一些。
- 存储大小不同, 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie。
- session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。Cookie有个setPath的方法,可以设置可访问的路径,那么同一个网站中不同路径下的cookie互相是访问不到的
什么是 Cookie:
Cookie是服务器发送到客户端并保存在本地的一小块数据,它会在客户端下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。cookie中的数据以{key:value}的形式存在。
cookie机制原理:
比如服务端要想记录用户的状态,就使用response向浏览器发送一个Cookie。客户端浏览器会将这个cookie保存起来。浏览器再次请求服务端时,浏览器会把这个cookie带上。服务端检查这个cookie来获取用户状态。
Cookie常用属性:
-
name cookie的名字,Cookie一旦创建,名称便不可更改
-
value cookie的值
-
domain 可以访问该cookie的域名。如果设置为“.baidu.com”,则所有以“baidu.com”结尾的域名都可以访问该Cookie;第一个字符必须为“.”
-
maxAge Cookie失效的时间,单位秒。 正数,则超过maxAge秒之后失效。 负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。 为0,表示删除该Cookie。
-
isHttpOnly HttpOnly属性是用来限制非HTTP协议程序接口对客户端Cookie进行访问,将取Cookie的操作放到服务端,这样能有效的防止XSS攻击。
创建Cookie:
Cookie cookie = new Cookie("cookieSessionId","qwertyuiop"); //构造函数
cookie.setDomain(".baidu.com"); // 设置域名
cookie.setPath("/"); // 设置路径
cookie.setMaxAge(Integer.MAX_VALUE); // 设置有效期为永久
response.addCookie(cookie); // 回写到客户端
复制代码
Cookie更新与删除:
Cookie本身并没有提供修改和删除的方法,一般通过使用相同name的Cookie来覆盖原来的Cookie,以达到更新或删除的目的。
Cookie cookie = new Cookie("cookieSessionId","new-qwertyuiop");
response.addCookie(cookie);
Cookie cookie = new Cookie("cookieSessionId","new-qwertyuiop");
cookie.setMaxAge(0);//设置一个立即失效的cookie覆盖原cookie
response.addCookie(cookie);
复制代码
如何获取与发送cookie
//服务端从客户端取得cookie
Cookie[] cookies = request.getCookies();
//服务端向客户端发送cookie
response.addCookie(cookie);
复制代码
对于Cookie来说,Cookie的同源只关注域名,是忽略协议和端口的。所以一般情况下,https://localhost:80和http://localhost:8080的Cookie是共享的。单个 Cookie 保存的数据不能超过 4K。
cookie的优缺点:
- 优点: 适合用于存放需要每个请求都必须携带的数据 服务端也可以直接操作 Cookie 可以通过 domain 以及 path 控制数据存储的范围
- 缺点: 容量有限,规范只要求每个域名下最低提供 4kb 的存储空间 每次请求都会携带,如果存放了大量不必要的数据很显然会影响页面性能 不安全,永远不要在 Cookie 中存放用户的敏感数据 前端 API 不友好,CRUD 都是通过 document.cookie 进行,没有提供相关操作的方法
Session
Session 代表着服务器和客户端一次会话的过程。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当客户端关闭会话,或者 Session 超时失效时会话结束。
session机制原理:
当客户端请求创建一个session时,服务端会先检查客户端的请求里面有没有带着session标识-sessionId。如果有,则说明服务器以前已为此客户端创建过session,于是就根据这个sessionId把session检索出来。如果客户端请求中不包含sessionId,则为客户端创建一个session并且生成一个与这个session相关联的sessionId。 这个sessionId将被在本次响应中返回给客户端保存。保存sessionId的方式大多情况下用的是cookie。
创建session
HttpSession session = request.getSession();
一只努力加载进度条的小前端,如果有错误,欢迎在评论中留言指正~