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

    ###1.cookie

      含义: 存储在访问者的计算机中的变量,即存储在客户端

      创建一个cookie

        /* getCookie方法判断document.cookie对象中是否存有cookie,若有则判断该cookie中是否含有指定c_name的cookie,有则返回数据      没有则返回空串 */

        function getCookie(c_name){

          if (document.cookie.length>0){

            c_start=document.cookie.indexOf(c_name + "=")   //   indexOf()  返回指定字符串值在某个字符串中首次出现的位置如果没有出现则返回-1

            if (c_start!=-1){ 

              c_start=c_start + c_name.length+1        //  0 + 8 + 1  即username=  之后的位置 9
              c_end=document.cookie.indexOf(";",c_start)   
              if (c_end==-1) c_end=document.cookie.length
              return unescape(document.cookie.substring(c_start,c_end))         //  subtring(start,stop)用于提取字符串中介于两个指定下标的字符     start必填,stop可选  参数都为非负整数

                 //  unescape() 对 escape() 编码的字符串进行解码

              
            }
          }
          return ""
        }

        /* setCookie方法将cookie名称为c_name的value值存入document.cookie对象中   */

        function setCookie(c_name,value,expiredays){
          var exdate=new Date()
          exdate.setDate(exdate.getDate()+expiredays)
          document.cookie=c_name+ "=" +escape(value) + ((expiredays==null) ? "" : "; expires="+exdate.toGMTString())      //结果为:  username= xxx;expires=xxx;

           // toGMTString()方法,根据格林威治时间 (GMT) 把 Date 对象转换为字符串,并返回结果。

          // escape(string) 函数可对字符串进行编码,就可以在所有计算机上读取该字符串。
        }

        /* checkCookie()方法调用getCookie()判断document.cookie对象中名称为username的cookie是否已经设置,若已经设置则显示提示框显示信息,反之调用setCookie()方法设置cookie */

        function checkCookie(){
          username=getCookie('username')
          if (username!=null && username!=""){alert('欢迎登陆 '+username+'!')}
          else {
            username=prompt('输入用户名:',"")
            if (username!=null && username!=""){
              setCookie('username',username,365)
            }
          }
        }

      附加:  删除cookie   将expires设置为过期时间即可  cookie名称可为空

        document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 GMT";

    ###2.session

      session依赖于cookie,它存储在服务器端

      session相当于程序在服务器上建立的一份用户的档案,用户来访的时候只需要查询用户档案表就可以了。

      HTTP协议是无状态的,session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为SESSIONID的cookie,它的值为该Session的id。Session依据该cookie来识别是否为同一用户。

      

    应用场景

    1. 通过session累计用户数据。例如,一个未登录用户访问了京东网站,这个时候京东对其下发了一个 cookie,假设cookie的名字叫做abc,那这条记录就是 abc=001,同时京东的后台也生成了一个 session id, 它的值也为 001, 001 这个客户在 2 点、 3 点、 4 点分别添加了三件商品到购物车,这样后台也记录了 session id 为 001的用户的购物车里面已经有三件商品,并且只要每次客户端 cookie 带上来的值里面包含session id,后台都能够展示相应的数据,如果这个时候,在浏览器里面清空 cookie,cookie 数据消失之后,后台和客户端无法建立对应关系,购物车的数据就会失效了。
    2. 通过session实现单点登录。一个用户帐号成功登录后,在该次session还未失效之前,不能在其他机器上登录同一个帐号。登录后将用户信息保存到session中,如果此时在另外一台机器上一个相同的帐号请求登录,通过遍历(遍历的意思就是将所有session都查看一遍)Web服务器中所有session并判断其中是否包含同样的用户信息,如果有,在另一台机器上是不能登录该帐号的。

    ###3.Cookie和Session区别

        1、cookie数据存放在客户的浏览器上,session数据放在服务器上 

        2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑*到安全应当使用session 
        3、session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie 
        4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie 
        5、建议将登录信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中 
        6、session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务器能够知道其中的信息 
        7、session中保存的是对象,cookie中保存的是字符串 
        8、session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到,而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的

    ###4.sessionStorage、localStorage和cookie的区别

    共同点:都是保存在浏览器端、且同源的 
    区别: 
        1、cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递,而sessionStorage和localStorage不会自动把数据发送给服务器,仅在本地保存。cookie数据还有路径(path)的概念,可以限制cookie只属于某个路径下 
        2、存储大小限制也不同,cookie数据不能超过4K,同时因为每次http请求都会携带cookie、所以cookie只适合保存很小的数据,如会话标识。sessionStorage和localStorage虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大 
        3、数据有效期不同,sessionStorage:仅在当前浏览器窗口关闭之前有效;localStorage:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;cookie:只在设置的cookie过期时间之前有效,即使窗口关闭或浏览器关闭 
        4、作用域不同,sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面;localstorage在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的 

  • 相关阅读:
    Centos7创建systemctl服务
    in a frame because it set 'X-Frame-Options' to 'sameorigin'
    systemd-journald服务占用CPU过高
    Centos7修改了最大文件打开数不生效
    Docker部署Redis主从和哨兵
    基于Vue的前端项目访问首页刷新后报404
    npm的.npmrc文件在哪里?缓存及全局包文件在什么位置?
    react native 淘宝镜像
    react native 示例代码
    iOS9 & iOS10 & iOS11 HTTP 不能正常使用的解决办法
  • 原文地址:https://www.cnblogs.com/john-hwd/p/10498686.html
Copyright © 2011-2022 走看看