一、cookie
1. 为什么需要cookie?
web程序使用HTTP协议进行传输,而HTTP协议是无状态的协议(即对事务处理无记忆性,如果后续处理需要使用前面的信息,只能重传,导致每次连接传送的数据量增大)。cookie的出现就是为了解决这个问题,把一些信息存下来,实现每次HTTP请求自动带数据给服务器。
2. 什么是cookie?
cookie的类型为“小型文本文件”,就是一些数据信息,是网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。
场景联想:cookie的作用
当我们打开一个网站时,如果这个网站我们曾经登录过,那么在一段时间内,当我们再次打开这个网站时,发现就不需要再次登录了,而是直接进入了首页。例如bilibili,csdn等网站。其实就是浏览器保存了我们的cookie,里面记录了一些用户信息。
cookie的基本流程:
1. 浏览器发起HTTP请求给服务器
2. 服务器进行cookie设置,即set-cookie,服务器会填充好name和value属性的值,发给浏览器
3. 浏览器存储好这个cookie
4. 浏览器之后发送的每个HTTP请求都会自动带上这个cookie,直到cookie失效
cookie就是一种存储在浏览器上的数据。
一般情况下,cookie以键值对的形式表示。
cookie中的常用属性:
Name:cookie的名字
Value:cooke的值
Path:定义了Web站点上可以访问该Cookie的目录
Expires:cookie的过期时间,也就是有效值,cookie在这个值之前都有效
Size:cookie的大小
Domain:指定了可以访问该 Cookie 的 Web 站点或域
Secure:指定是否使用HTTPS安全协议发送Cookie
HTTPOnly:用于防止客户端脚本通过document.cookie属性访问Cookie,有助于保护Cookie不被跨站脚本攻击窃取或篡改。但是,HTTPOnly的应用仍存在局限性。
Java中cookie的常用方法:
new Cookie(String name, String value):创建一个Cookie对象,必须传入cookie的名字和cookie的值
getValue():得到cookie保存的值
getName():获取cookie的名字
setMaxAge(int expiry):设置cookie的有效期,默认为-1。这个如果设置负数,表示客服端关闭,cookie就会删除。0表示马上删除。正数表示有效时间,单位是秒。
setPath(String uri):设置cookie的作用域
HttpServletRequest和HttpServletResponse对Cookie进行操作的常见方法:
- response.addCookie(Cookie cookie):将cookie给客户端进行保存
- resquest.getCookies():得到客服端传过来的所有cookie对象
cookie的生命周期:
当浏览器客户端向服务器端发送一个请求时,服务端向浏览器发送一个Cookie然后浏览器将Cookie保存。
cookie有2种存储方式,一种是会话性,一种是持久性。
会话性:如果cookie为会话性,那么cookie仅会保存在客户端的内存中,当我们关闭客服端时cookie也就失效了
持久性:如果cookie为持久性,那么cookie会保存在用户的硬盘中,直至生存期结束(Expires)或者用户主动将其销毁。
3. cookie存在的问题
-
数量限制:一个浏览器能创建的 Cookie 数量最多为 300 个,并且每个不能超过 4KB;每个 Web 站点能设置的Cookie 总数不能超过 20 个。
-
安全性不高:只要电脑被黑,cookie里的信息就会泄露。跨站点脚本攻击往往利用网站漏洞在网站页面中植入脚本代码或在网站页面引用第三方法脚本代码。在受到跨站点脚本攻击时,脚本指令将会读取当前站点的所有Cookie 内容(已不存在 Cookie 作用域限制),然后通过某种方式将 Cookie 内容提交到指定的服务器(如:AJAX)。一旦 Cookie 落入攻击者手中,它将会重现其价值。
cookie适用于对安全性要求不高,不会存储大量数据的情况。
出于安全性的需求,又出现了session会话控制机制。
二、session会话
1. 什么是会话?
在浏览器与服务器之间进行,浏览器访问服务器是会话的开始,但会话的结束比较模糊,因为关闭浏览器可能只是按错而已。
因此,不同网站给每个用户的会话都设定了时间(结束会话的时间)和唯一ID(Session ID,通常是一串无规律字符串),由服务器设置,存储在服务器上。
2. 什么是session?
使用Session的流程:
1. 浏览器发送用户名和密码给服务器,服务器验证身份,若正确则身份验证成功
2. 服务器创建一个Session ID和会话结束时间,并设置cookie。将Session ID加入到cookie中,把会话时间设置为这个cookie的有效期,并对这个cookie进行签名(如果黑客修改了Session ID,服务器也识别不了),发送给浏览器。
3. 浏览器保存这个cookie(cookie存储的不是用户名和密码,而是无规律的字符串Session ID,即使电脑被黑,安全性大大提高)
4. 浏览器之后发送的每个HTTP请求都会自动带上这个cookie,直到cookie失效,会话结束
session类似于一个Map,可以存放多个键值对,key必须是一个字符串,value是一个对象。
session常用方法
resquest.getSession():得到请求游览器(客户端)对应的session。如果没有,那么就创建应该新的session。如果有那么就返回对应的session
setAttribute(String s, Object o):在session存放属性
getAttribute(String s):从session中得到s所对应的属性
removeAttribute(String s):从session中删除s对应的属性
getId():得到session所对应的id
invalidate():使session立即无效
setMaxInactiveInterval(int i):设置session最大的有效时间。注意,这个有效时间是两次访问服务器所间隔的最大时间,如果超过最大的有效时间,那么这个session就失效了。
三、cookie和Session的区别
-
数据存放位置不同:cookie保存在客户端,session保存在服务端。
-
安全程度不同:cookie的安全性较低,考虑到安全应当使用session。
-
cookie作用于它所表示的path中(url中要包含path),范围较小。session代表客户端和服务器的一次会话过程,web页面跳转时也可以共享数据,范围是本次会话,客户端关闭也不会消失。会持续到我们设置的session生命周期结束(默认30min)
-
使用session需要cookie的配合,由cookie携带Session ID
-
数据存储大小不同:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储于服务端,浏览器对其没有限制。cookie存放的数据量较小,session可以存储更多的信息。
-
性能使用程度不同:session会在一定时间内保存在服务器上。当访问增多,会影响服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
参考:http://t.csdnimg.cn/992Qu
http://t.csdnimg.cn/bsOxr
Cookie、Session、Token究竟区别在哪?如何进行身份认证,保持用户登录状态?_哔哩哔哩_bilibili
http://t.csdnimg.cn/KGKor