cookie和session-04

cookie:浏览器中存储数据的容器

  1. 可以实现数据持久化存储,可以同一个网站下的多个页面共享cookie中的数据

  2. 可以用JS来操作cookie,也可以后台如php操作。

  3. cookie中的数据,如果不设置有效期,页面关闭 ,数据就销毁了。

JS操作cookie的方式:

 cookie和session-04

 在实际工作中,原生JS操作cookie,很麻烦,因为要不断的用split去截取分割。用JQ方便简单些,需要引入两个库:jq和jq.cookie

cookie和session-04

后台php如何操作cookie?

cookie和session-04

 问题: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。

图示过程:

  cookie和session-04

 

 

 作为上图的补充:

  当然浏览器再次访问这个页面的时候,如果整个浏览器没关掉,会重启会话,是不会新生成一个session_id的,还是浏览器第一次访问时候生成的那个;如果是浏览器关掉,服务器会开启新的会话,

这样,就会又生成一个新的session_id,并按照之前的步骤传递给浏览器。当然这时候服务器的缓存tmp临时文件中,就多了一个session_id文件(原来的还在),浏览器中的cookie也会重新设置(之前的随着浏览器的关闭,cookie就销毁了)

cookie和session-04 cookie和session-04

 

 

 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文件中。

cookie和session-04

 

 服务器在验证登录成功后,会通过响应报文把sessionID告诉浏览器,浏览器存储到cookie中:name= PHPSESSID; value = sessionID

cookie和session-04

 

 因为服务器在验证登录成功后,又让其跳转到首页,所以,首页为了能有登录态,得在浏览器向服务器请求首页数据的时候,得携带上cookie中的PHPSESSID的值过去,这样,服务器再去比对过这个sessionID正确后,去对应的sessionID文件中查找数据然后返回给浏览器首页数据。

问题:tmp文件夹中的sessionID文件那么多,不用做判断就直接要数据了?

  因为浏览器携带的这个sessionID,只要能找到,服务器会自动根据sessionID找到同名文件,返回数据。不用我们自己手动写逻辑比对。(如果是写逻辑,要去遍历一下文件列表,然后拿到对应关系,这些服务器自动帮我们做了)

cookie和session-04

 

 可以把以上代码提取出去封装在一个函数内,然后各个页面引入,以此来判断是否登录过即可。

退出登录:

前端可以清楚cookie。

后端可以清除掉session文件的内容(无法代码删除文件,只能删除文件中的内容)

cookie和session-04

 

 

 

上一篇:ts类型-枚举


下一篇:HGDB兼容MySQL date_format函数