您现在的位置是:网站首页 > 心得笔记
php中的会话控制——cookie
http是一个超文本传输协议。http是典型的请求响应模式,最大的特点是无连接无状态
无连接——限制每次连接只处理一个请求,服务器处理完客户的请求后并且接收到客户的响应后,就关闭此次连接。客户端再发送一次请求就再来一次请求响应。采用这种连接最大好处就是节省传输时间。
无状态——协议对事务没有处理和记忆能力,当我们给服务器发送请求后,服务器会根据请求发送给我们数据,但是发送完它不会记录任何信息,不会知道这是谁过来发送的。这也意味着每发送一个请求都是独立的。缺少状态也就意味着,我们后续处理,如果想要使用前面的信息就获取不到了。正是因为这个特点,如果想实现购物车,页面跳转之间让服务器还能认识你,获取到你的信息,这就需要会话控制思想来解决!
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的过期时间!
1、cookie中不要存放敏感数据,因为cookie是明文存储的,不安全,截取cookie之后可以用来cookie欺骗!
2、不要把cookie当做客户端存储器使用,每个域名允许的cookie是有限制的。而且根据不同浏览器限制也不同。cookie中保存数据最大字节数是4k!
3、cookie设置之后,每次都会附着在HTTP的头部一起发送,浪费带宽!
由于cookie的这些缺陷,可以用html5中新增的特性localStorage!
上一篇:倒计时效果
下一篇:会话控制——session