zoukankan      html  css  js  c++  java
  • cookie和session-04

    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文件的内容(无法代码删除文件,只能删除文件中的内容)

     

  • 相关阅读:
    【UGUI】源码 -- 0总框架
    【Unity】 细说AssetBundle
    Unity文件引用、meta文件详解
    ( 资源管理器03 )Prefab加载自动化管理引用计数管理器
    ( 资源管理器 02 )AssetBundle 同步异步引用计数资源加载管理器
    ( 资源管理器 01 )Asset同步异步引用计数资源加载管理器
    git status 显示中文和解决中文乱码
    C# 16进制与字符串、字节数组之间的转换
    mac地址转byte数组
    unity插件调用打印机
  • 原文地址:https://www.cnblogs.com/haoqiyouyu/p/14259337.html
Copyright © 2011-2022 走看看