您现在的位置是:网站首页 > 心得笔记

php中的会话控制——cookie

盛悦2019-03-18584人围观
简介cookie 就是浏览器储存在用户电脑上的一小段文本文件。cookie 是纯文本格式,不包含任何可执行的代码。一个 Web 页面或服务器告知浏览器按照一定规范来储存这些信息,并在随后的请求中将这些信息发送至服务器,Web 服务器就可以使用这些信息来识别不同的用户。

1、浅析http协议

http是一个超文本传输协议。http是典型的请求响应模式,最大的特点是无连接无状态

10.png

无连接——限制每次连接只处理一个请求,服务器处理完客户的请求后并且接收到客户的响应后,就关闭此次连接。客户端再发送一次请求就再来一次请求响应。采用这种连接最大好处就是节省传输时间。

无状态——协议对事务没有处理和记忆能力,当我们给服务器发送请求后,服务器会根据请求发送给我们数据,但是发送完它不会记录任何信息,不会知道这是谁过来发送的。这也意味着每发送一个请求都是独立的。缺少状态也就意味着,我们后续处理,如果想要使用前面的信息就获取不到了。正是因为这个特点,如果想实现购物车,页面跳转之间让服务器还能认识你,获取到你的信息,这就需要会话控制思想来解决!

2、cookie

2.1、cookie产生的历史因素

用来达成浏览器和服务器之间的一种持续连接的状态,来解决无状态的问题,让服务器知道用户是谁。

2.2、cookie保存在哪里

cookie总是保存在客户端中,按照客户端的存储位置可分为内存cookie和硬盘cookie两类。

2.2.1、什么是内存cookie、硬盘cookie?

内存cookie是由浏览器维护,保存在内存中,浏览器关闭后就会消失了,存在时间短暂。(没有指定过期时间)

硬盘cookie是保存在硬盘里,有一个过期时间,除非用户手动清除或者到了过期时间,否则硬盘cookie不会被删除,其存在时间是长久的。

2.3、cookie使用场景

自动登录、购物车。在浏览器的cookie是以小文件的形式保存在客户端中。

2.4、通过php操作cookie

2.4.1、设置cookie

setcookie(name, value, expire, path, domain, secure )

param1必选,cookie名称

p2必选,cookie值

p3可选,cookie有效期,默认值0,单位秒

p4可选,设置cookie有效路径,默认当前目录极及其子目录有效,也可指定成在整个根目录下有效

p5可选,设置cookie的作用域,默认在本域下

p6可选,设置是否只通过https连接来传输,默认false

setrawcookie()参数和使用方法同上!两者区别:setcookie()会对cookie进行urlencode编码,setrawcookie()不会对cookie做urlencode编码!

2.4.2、读取cookie

cookie数据以数组的形式保存在$_COOKIE

2.4.3、更新cookie

还是setcookie(),修改时保证path、domain跟修改前的值一致。

2.4.4、删除cookie

使用setcookie()让cookie过期便可!即过期时间time()-1

注意:更新和删除时需要保证path和domain和之前的保持一致才可以!否则不会修改,而是重新生成新的值。

2.5、通过header函数操作cookie

通过header("Set-Cookie:name=value;expires=date;path=path");

例如:

header("Set-Cookie:b=2;expires=".gmdate('D, d M Y H:i:s \G\M\T',time()+3600));


2.6、cookie保存数组形式的数据

setcookie('userInfo[username]','king');
setcookie('userInfo[age]',26);
setcookie('userInfo[email]','123654@qq.com');

var_dump($_COOKIE);
打印结果
  "userInfo" => array:3 [▼
    "username" => "king"
    "age" => "26"
    "email" => "123654@qq.com"
  ]

2.7、通过js操作cookie

//通过js操作cookie
    var Cookie = {
        set:function(key,value,expires){
            //判断是否设置了expires
            if (expires) {
                var date = new Date();
                date.setTime(date.getTime()+expires*24*60*60*1000);//格式化时间
                var expires = "expires="+date.toGMTString()+';';
            } else {
                var expires = '';
            }
            document.cookie = key+'='+escape(value)+';'+expires;
        },
        get:function(key){
            var getCookie = document.cookie.replace(/[ ]/g, '');//空格替换成空
            //document.cookie="XSRF-TOKEN=eyJpdiI6IlE0VUlueHNtRk5TUzZmcWRoQjR3R1E9PSIsInZhbHVlIjoiQ0syYkJoSEdcL3p1TUg4Mjc1MUl5elhjNlwvZWdLdWZYWW1CbVZwWTFkdlJVXC9HeWpDT2dGc1Jrb3dLYzFCRXBQWiIsIm1hYyI6IjhjNzM3YzE1MzFiYjdmODZjYzYyZmFkNDViODFkZGJlOTgwNjg0NTc0N2EzNzY5OGJhOTY5NzFhM2I2NDlhYjcifQ%3D%3D; username=king1; age=26; email=123456%40qq.com; a=1; userInfo[username]=king; userInfo[age]=26; userInfo[email]=123654%40qq.com; tel=123455"

            var resArr = getCookie.split(';');//拆分成数组
            var res;
            for (var i=0,len=resArr.length;i<len;i++) {
                var arr = resArr[i].split('=');
                if (arr[0] == key) {
                    res = arr[1];
                    break;
                }
            }
            return unescape(res);
        }
    };

2.8、Cookie实战之自动登录效果

自动登录难点? 
     如果选择了自动登录,会给客户端发送像令牌一样的登录凭证,下一次再访问的时候,如果你有这个凭证,它会随着你的http头部一起发送给服务器,服务器拿到令牌之后,会先进性验证,看是不是合法用户,如果是才会跳转到首页!


控制器代码:

<?php
namespace App\Http\Controllers\Front;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class QQloginController extends Controller
{
      //登录页面
    public function login(){
        return view('front.test.login');
    }

      //保存登录数据
    public function store(Request $request) {
        $name = trim($request->input('name'));
        $password = trim($request->input('password'),'');
        $autologin = ($request->input('autologin')=='on')?1:0;//是否选择自动登录
        $result = DB::table('user')->where('name', $name)->where('password', md5($password))->select('id', 'name')->first();
        if ($result) {//用户名和密码匹配成功
            if ($autologin==1) {//选择自动登录
                setcookie('name',$name,strtotime('+7 days'));
                //选择自动登录后,需要给用户发送一个登录凭证
                $salt = 'blonglee';
                $auth = md5($name.$salt).':'.$result->id;
                setcookie('auth',$auth,strtotime('+7 days'));
            } else {//没有勾选自动登录
                setcookie('name',$name);
            }
            exit("<script>
                        alert('登录成功!');
                        window.location.href='/';
                  </script>");
        } else {
            exit("<script>
                        alert('登录失败!');
                        window.location.href='/login';
                  </script>");
        }

    }
}


视图代码:

......
<?php
    use Illuminate\Support\Facades\DB;
        if (!isset($_COOKIE['name'])) {
            exit("<script>
                        alert('请先登录!');
                        window.location.href='/login';
                  </script>");
        }
        if (isset($_COOKIE['name']) && isset($_COOKIE['auth'])) {//cookie中有用户名和凭证,需判凭证正确性
                $auth = $_COOKIE['auth'];
                //如果有登录凭证,验证下凭证是否正确
                $resArr = explode(':',$auth);
                $id = end($resArr);
                $result = DB::table('user')->where('id',$id)->select('name')->first();
                if ($result) {
                    $name = $result->name;
                    $salt = 'blonglee';
                    $authStr = md5($name.$salt);
                    if ($authStr != $resArr[0]) {
                        exit("<script>
                        alert('请先登录!');
                        window.location.href='/qqlogin';
                  </script>");
                    }
                } else {
                    exit("<script>
                        alert('请先登录!');
                        window.location.href='/qqlogin';
                  </script>");
                }
        }
    ?>
......
<!--以下是视图部分-->

以上代码运行后便可实现自动登录,简言之:自动登录其实就是设置cookie的过期时间!

2.9、cookie的缺点

1、cookie中不要存放敏感数据,因为cookie是明文存储的,不安全,截取cookie之后可以用来cookie欺骗!

2、不要把cookie当做客户端存储器使用,每个域名允许的cookie是有限制的。而且根据不同浏览器限制也不同。cookie中保存数据最大字节数是4k!

3、cookie设置之后,每次都会附着在HTTP的头部一起发送,浪费带宽!

由于cookie的这些缺陷,可以用html5中新增的特性localStorage!


上一篇:倒计时效果

下一篇:会话控制——session