一、背景由于HTTP协议是无状态的,即服务器不知道用户上次做了什么,严重阻碍了交互式Web应用的实现二、Cookie简介:Cookie:是指一些网站为了识别用户身份和进行会话跟踪而存储在用户本地终端上的数据(通常是加密的)机制:Cookies由服务器生成并发送给客户端(通常是浏览器)。Cookie始终保存在客户端中。根据在客户端的存储位置,可分为内存cookies和硬盘cookies:内存cookies由浏览器维护,保存在内存中。它们在浏览器关闭后消失。是短暂的。硬盘cookie保存在硬盘中,有过期时间。除非用户手动清除或达到过期时间,否则硬盘cookie不会被删除,其存在时间是长期的。因此,根据存在的时间,可以分为非持久性cookies和持久性cookies。工作原理创建cookie当用户第一次浏览使用cookies的网站时,该网站的服务器执行以下工作:①用户生成一个唯一的识别码(Cookieid),并创建一个Cookie对象;②默认情况下是会话级cookie,保存在浏览器内存中,当用户退出浏览器时被删除。如果网站想让浏览器把cookie存盘,就需要设置最大年龄(maxAge),并给出一个秒数的时间(设置最大年龄为0就是命令浏览器删除cookie);③PutCookieintoHTTPResponseHeader,InsertCookieintoaSet-CookieHTTPResponseHeader。④发送HTTP响应报文。浏览器收到响应消息后,根据消息头中Set-Cookie的特殊说明生成相应的cookie保存在客户端。cookie记录了用户当前的信息。当用户再次访问该网站时,浏览器首先检查所有存储的Cookies,如果有该网站的cookie,则将cookie附加到所请求资源的HTTP请求头中,发送给服务器。读取cookie服务器收到用户的HTTP请求报文后,从报文头中获取用户的Cookie,并从中找到自己需要的。功能:cookies的基本功能是在客户端存储用户访问网站的一些信息。典型应用包括:记住密码,下次自动登录。购物车功能。记录用户浏览数据,推荐商品(广告)。缺陷:①每次HTTP请求都会附加Cookies,无形中增加了流量。②由于HTTP请求中的Cookie是明文传递的,安全性是个问题。(除非使用HTTPS)③cookie的大小限制在4KB左右。不足以满足复杂的存储需求。Cookie不支持手机访问3、Session介绍:Session:表示服务器与浏览器之间的一个会话过程。这个过程是连续的或间歇的。Session是一种服务器端机制,Session对象用于存储特定用户会话所需信息的机制:Session由服务器产生,存储在服务器的内存、缓存、硬盘或数据库中。工作原理创建会话当用户访问服务器时,如果服务器启用了Session,则服务器会为用户创建一个SESSION。服务器在创建SESSION时,首先检查用户发送的请求中是否包含SESSIONID。如果包含一个SESSIONID,说明该用户之前登录过并为该用户创建过一个SESSION,那么服务器会根据这个SESSIONID在服务器内存中找到这个SESSION。如果客户端请求不包含SESSIONID,则为该客户端创建一个SESSION,并生成与该SESSION相关的SESSIONID。这个SESSIONID是唯一的,不重复的,不容易找到的正则字符串。这个SESSIONID会在这个response中返回给客户端进行存储,保存这个SESSIONID的是COOKIE,以便浏览器在交互过程中进行交互。根据规则自动将这个标识符发送给服务器。使用session,我们知道在IE中,我们可以在工具的Internet选项中禁用cookie,那么会不会出现客户端的cookie被禁止,所以SESSIONID就不能再用了呢?我查了一些资料说可能有其他机制在禁止COOKIE的情况下仍然可以将SessionId传回服务器。一种经常使用的技术叫做URL重写,就是直接把Sessionid追加到URL路径上。一个用作URL路径。表单中的附加信息:http://…./xxx;jSession=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764另一种是作为查询字符串附加到URL中,格式为:http://…../xxx?jSession=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764还有一个表单隐藏字段。即服务器会自动修改表单,增加一个隐藏字段,以便在提交表单时将Sessionid传回服务器。作用:Session的根本作用是在服务器端存储用户和服务器会话的一些信息。典型应用包括:判断用户是否登录。购物车功能。缺陷:占用服务器性能:存储大量session服务器可扩展性:当前服务器有效sessionsticky总是粘在机器A上进行session复制,在两台机器之间移动sessionid并将sessionid集中存储在一个地方CORS(跨域资源共享:限制跨域请求CSRF(Cross-siteRequestForgery):拦截CookiesCookie和Session的区别是存储在不同的位置:Cookies存储在客户端,Session存储在服务器端边。访问方式不同:cookies中只能存储ASCII字符串。如果需要访问Unicode字符或二进制数据,则需要先对它们进行编码。Cookie不能直接访问Java对象。要存储稍微复杂的信息,使用cookie比较困难。Session可以访问任何类型的数据,包括但不限于String、Integer、List、Map等。Session还可以直接保存JavaBean甚至是任何Java类、对象等,使用起来非常方便。您可以将Session视为Java容器类。安全性(隐私政策)的差异:Cookies保存在浏览器中,对客户端可见,客户端的某些程序可能会窥探、复制甚至修改cookies的内容。Session保存在服务器端,对客户端透明,不存在敏感信息泄露风险。如果选择cookies,更好的办法是尽量不要将账户密码等敏感信息写入cookies。cookie信息最好像谷歌、百度一样加密,提交到服务器后再解密,保证cookie中的信息只有本人才能阅读和理解。而如果选择Session的话,会省去很多麻烦。反正放在服务器上,Session中的任何隐私都可以得到有效的保护。有效期不同:只需要将cookie的过期时间属性设置成一个很大的数字,cookie就可以长期保存在浏览器中。由于Session依赖于名为JSESSIONID的Cookie,而CookieJSESSIONID的过期时间默认为-1,所以只要关闭浏览器(一个会话结束),Session就会失效。对服务器的压力不同:session保存在服务器端,每个用户都会产生一个session。如果并发访问的用户很多,会产生很多Session,消耗大量内存。但是cookies是保存在客户端的,不占用服务器资源。如果有很多用户同时浏览,Cookie是一个不错的选择。跨域支持的区别:Cookies支持跨域访问。例如domain属性设置为“.baidu.com”,则所有以“.baidu.com”为后缀的域名都可以访问该cookie。跨域cookie现在在Internet上很普遍。Session不支持跨域访问。session只在他的域名范围内有效。令牌(token)工作流程用户通过用户名和密码发送请求。服务器接收请求并验证用户名和密码(查询数据库)。验证成功。服务端使用JWT颁发Token,并将Token返回给客户端。客户端在每次访问API时收到存储在客户端(Cookie或LocalStorage)上的Token后,携带Token到服务端。服务器接收请求,验证令牌并返回数据优势无状态,可扩展支持移动设备上的跨程序调用安全
