Cookie:
(小饼干,HTTP定义的一种由客户端(浏览器)保存临时数据的形式)
(小饼干处理内容的过程有两种,一种是后台(JAVA),一种是前端(JS))
Cookie保存内容的形式是K-V对,一般是用K=V,K=V形式来保存内容的。
每次浏览器发出请求的时候,都会将自己的Cookie发送给后台,有多少,发多少。
后台如果想要设置让前端保存什么内容的话,会通过Set-Cookie头来通知前端保存内容
cookie.setDomain("qq.com"); //设置域名
cookie.setPath("/web/index"); //设置路径
cookie.setMaxAge(3600*24*7); //设置最大存在时间,单位秒
resp.sendRedirect("success.html"); //跳转
CSRF攻击:错误的使用Cookie,过分依赖Cookie.
HTTP是一种无状态的协议,即HTTP是不能记录用户状态的
什么是无状态:同一个浏览器第一次和第二次发出的请求,服务器是没有办法分辨的。但是我们知道HTTP是基于TCP实现的,TCP是有状态的,比如:连接建立以后,这个连接就是一种状态,如果登陆成功了,也就是这个连接都登陆成功了。
为什么HTTP是一种无状态的协议:因为HTTP是短连接,HTTP基于TCP实现不假,但是HTTP的玩法是连接,数据传输,断开,这个时候,TCP已经断了,所以下一次HTTP是一个新的TCP请求,所以我们说HTTP是无状态的。
但是有时候确实需要HTTP协议在前端记录一些内容,来模拟HTTP的状态,这个时候我们就可以使用一种叫做Cookie的东西来实现这个过程
但是,Cookie这种保存在前端的内容对于后台来说其实是不可信的。因为Cookie的值很容易被改变,如果我们将一些很敏感的、很重要的信息保存在Cookie中,就会对后台产生很大的影响
所以一般情况下Cookie中记录的值,都是一些无关紧要的或者不易被修改的值
为了解决HTTP的无状态特性,我们引入了Cookie
为了解决Cookie的不可信问题,我们引入Session(会话)
Session一般来说是基于Cookie来做的,特殊情况下,我们会加入四种Session的追踪方式
Cookie的缺点是写在了前端。前端里面保存的KV对是不可信的。
如果我们把内容保存在后台,前端就无法修改这些信息
Session就是保存在后台的一种KV对的存储结构,但是其保存过程又要和前端保持一致。所以我们设计Session的时候,将其保存的内容格式设计成<Y,<K.V>>
最外层的Y是一个ID值,他将被写在Cookie中发给前端,是一个32位16进制数字(200年不重复);这个Y对应了另一个MAP结构,这个Map里面保存着持有Y的ID的前端所记录的所有状态
HttpSession session=req.getSession();session.setAttribute("username",user); //设置session值
HttpSession session=req.getSession();
User user = (User) session.getAttribute("username");