cookie:浏览器中存储数据的容器
1. 可以实现数据持久化存储,可以同一个网站下的多个页面共享cookie中的数据
2. 可以用JS来操作cookie,也可以后台如php操作。
3. cookie中的数据,如果不设置有效期,页面关闭 ,数据就销毁了。
JS操作cookie的方式:
在实际工作中,原生JS操作cookie,很麻烦,因为要不断的用split去截取分割。用JQ方便简单些,需要引入两个库:jq和jq.cookie
后台php如何操作cookie?
问题:cookie在浏览器中,服务器为什么可以获取cookie和设置cookie?
1- 每次请求服务器,浏览器会自动将cookie中的数据添加到请求头中,发送给服务器。
2- 服务器setcookie方法,设置的响应头,响应报文会发送给浏览器,浏览器会解析响应报文,浏览器根据响应报文自行设置cookie。
总而言之,服务器无法直接操作cookie。而是设置响应报文,浏览器根据响应报文去自行设置,所以cookie的设置还是浏览器自己进行的行为。
服务器以php为例,有个tmp文件夹中专门存储cookie。
服务器在操作cookie时候,得先开启或重启会话。如php中的 session_start();
---> 开启:新打开当前页面
---> 重启:从一个页面到另一个页面(当前网站下的)
当关闭页面时候,会话就结束。
session_start() 做了三件事:
1)判断浏览器cookie中是否有PHPSESSID,如果有继续用同一个session文件,
如果没有PHPSESSID,创建一个新随机的sessionID,
2)还会创建一个同名的session文件存放数据
3)通过响应报文将sessionID传递给浏览器的cookie。
图示过程:
作为上图的补充:
当然浏览器再次访问这个页面的时候,如果整个浏览器没关掉,会重启会话,是不会新生成一个session_id的,还是浏览器第一次访问时候生成的那个;如果是浏览器关掉,服务器会开启新的会话,
这样,就会又生成一个新的session_id,并按照之前的步骤传递给浏览器。当然这时候服务器的缓存tmp临时文件中,就多了一个session_id文件(原来的还在),浏览器中的cookie也会重新设置(之前的随着浏览器的关闭,cookie就销毁了)
HTTP协议特点:无状态、无记忆、多次请求之间,无任何联系。
- 即同一用户请求同一网站的不同页面,服务器无法识别是否是同一用户发起的请求 ,因此,用户无法进行连续的业务逻辑。
例如:登录,在A页面登录后,再去请求B页面,B页面还是会让登录。
http为什么要这么做呢?
-- 比如A访问淘宝,淘宝服务器给予了数据响应,此时这个进程就释放掉了; 原则就是访问一次,释放一次。因为如果有几十万几百万人都在访问,每个人的请求信息都存着不释放掉,那么服务器会崩溃的。
所以http协议这种特点也是必须的。
登录拦截:
如何判断用户之前是否登录过? 比如在登录页面登录成功了,这时候想要去请求列表页,你不能再让用户登录一遍把(这就是http协议的特点)
1- 在用户登录成功时,给用户添加一个标记;
session_start();
1) - 服务器会产生一个sessionID
2) - 会生成一个同名的sessionID文件用于存储数据
3) - 把sessionID给到登录用户成功用户的cookie
2- 在用户再次登录时,判断用户是否携带有这个标记,并且判断是否和服务器的一致,有说明登录过,如果没有去让其去登录:
1) - 判断用户是否携带sessionID过来;
没有,去登录
2) -sessionID是否和服务器的一致,
直接通过去session文件中(tmp文件夹中)取数据,即可判断
如果真实的sessionID,后台一定有同名的session文件可以获取数据;
这样,登录成功后,有了sessionID这个标记,同源下的其他的页面也可以拿到cookie中存储的这个标记了。就可以是登录态了。
代码演示:
登录成功时,服务器开启会话,生成sessionID和同名文件,并把前端传过来的登录信息存入这个sessionID文件中。
服务器在验证登录成功后,会通过响应报文把sessionID告诉浏览器,浏览器存储到cookie中:name= PHPSESSID; value = sessionID
因为服务器在验证登录成功后,又让其跳转到首页,所以,首页为了能有登录态,得在浏览器向服务器请求首页数据的时候,得携带上cookie中的PHPSESSID的值过去,这样,服务器再去比对过这个sessionID正确后,去对应的sessionID文件中查找数据然后返回给浏览器首页数据。
问题:tmp文件夹中的sessionID文件那么多,不用做判断就直接要数据了?
因为浏览器携带的这个sessionID,只要能找到,服务器会自动根据sessionID找到同名文件,返回数据。不用我们自己手动写逻辑比对。(如果是写逻辑,要去遍历一下文件列表,然后拿到对应关系,这些服务器自动帮我们做了)
可以把以上代码提取出去封装在一个函数内,然后各个页面引入,以此来判断是否登录过即可。
退出登录:
前端可以清楚cookie。
后端可以清除掉session文件的内容(无法代码删除文件,只能删除文件中的内容)