1.HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
cookie由服务器发送给客户端(浏览器),只要cookie没过期,以后每次客户端向这个服务器发送http请求时都会自动带上cookie信息。
2.查看某个网站颁发的Cookie很简单。在浏览器地址栏输入JavaScript:alert (document. cookie)就可以了.
Cookie具有不可跨域名性.
3.boolsetcookie ( string $name
[, string$value
= "" [,int$expire
= 0 [,string$path
= "" [,string$domain
= "" [,bool$secure
= false [,bool$httponly
= false ]]]]]] );
cookie设置有一下几个选项:
name:相当于KEY键值,在一个网站内是唯一的 ,后面设置的同名 的 name会覆盖前面的 ;因此要删除一个 cookie值,可以把这个同名name的value值设为空(null);
value:相当于数组中的value值;通过$_COOKIE['name']查看访问;
exipire:是一个 unix timestamp格式,是一个以秒为单位的整数;setcookie('a','hello',time()+3600*24*7)将在7天后过期。如果设置为0或忽略,将在会话介绍后失效(浏览器关闭)。
path:该Cookie的使用路径;默认为当前目录及子目录下可用;设置为"/"时,则本域名下都可以访问;
domain:可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。
secure:设为true时将只能通过https访问;
httponly:设为true时将只能通过http协议访问,不能通过javascript等脚本语言访问。防止XSS攻击;
4.通过cookie可以记录用户登陆信息。
<?php $username=$_POST['username']; $password=md5($_POST['password']); $autoLogin=(int)($_POST['autoLogin']); $link=mysqli_connect('localhost','root','root','session'); mysqli_query($link,'set names utf8'); $username=mysqli_real_escape_string($link,$username); $sql="select id,username from user WHERE username='{$username}' AND password='{$password}'"; $result=mysqli_query($link,$sql); if($result&&mysqli_affected_rows($link)==1){ if($autoLogin){ $expTime=time()+7*24*3600; }else{ $expTime=0; } setcookie('isLogin',1,$expTime); setcookie('autoLogin',1,$expTime); setcookie('username',$username,$expTime); exit("<script> alert('成功'); location.href='index.php'; </script>"); }else{ exit("<script> alert('失败'); location.href='index.php'; </script>"); }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>login</title> </head> <body> 您好: <?php if(empty($_COOKIE['autoLogin'])){ if(empty($_COOKIE['isLogin'])||empty($_COOKIE['username'])){ echo "<a href='login.php'>请登录</a>"; } }else{ echo $_COOKIE['username']."!!!!"; echo "<a href='logout.php'>退出</a>"; } ?> </body> </html>
<?php setcookie('isLogin','',time()-1); setcookie('autoLogin','',time()-1); setcookie('username','',time()-1); header('location:index.php');
5.JS操作COOKIE:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>login</title> </head> <body> <script> function set_cookie(name,value){ var days=7; var expTime=new Date(); expTime.setTime(expTime.getTime()+days*24*3600*1000); document.cookie=name+"="+decodeURI(value)+";expires="+expTime.toUTCString(); } set_cookie('f',8886); function get_cookie(name){ var arr; var reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)"); if(arr=document.cookie.match(reg)){ return arr[2]; }else{ return null; } } function del_cookie(name){ var expTime=new Date(); expTime.setTime(expTime.getTime()-1); var cookieValue=get_cookie(name); if(cookieValue!=null){ document.cookie=name+"="+cookieValue+";expires="+expTime.toUTCString(); } } alert(get_cookie('username')); del_cookie('a'); </script> </body> </html>6. HTML5 web 存储,一个比cookie更好的本地存储方式;
localStorage['a1']=1; localStorage['a2']=22; localStorage['username']='king box'; localStorage.setItem('aaa',5446); console.log(localStorage.getItem('aaa')); console.log(localStorage['username']); localStorage.removeItem('a1'); var showStorage=function(){ var storage=window.localStorage; for(var i= 0,len=storage.length;i<len;i++){ console.log(storage.key(i)+":"+storage.getItem(storage.key(i))); } } showStorage(); localStorage.clear(); </script>
二-----SESSION
Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
大部分session机制都使用会话cookie来保存session_id,
而关闭浏览器后这个session_id就消失了,再次连接服务器时也就无法找到原来的session。
如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,
把原来的session_id发送给服务器,则再次打开浏览器仍然能够找到原来的session。
session工作原理_
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(来保存信息。___
_当客户端请求创建一个session的时候,服务器首先检查客户端请求里是否已包含了一个session标识session_id,
如果已包含一个session_id则说明以前已经为此客户端创建过session,
服务器就按照session_id把这个session检索出来使用。_
如果客户端请求不包含session_id,则为此服务器创建一个session并且生成一个与此session相关联的session_id。
session_id的值是一个既不会重复,又不容易被找到规律以仿造的字符串,
这个session_id将被在本次响应中返回给客户端保存。_
保存这个session_id的方式可以采用cookie。一般这个cookie的名字都是类似于SEEESIONID
1.
<?php session_start(); $_SESSION['username']='king'; $_SESSION['salary']=8426; $_SESSION['age']=45; $_SESSION['married']=true;
<?php //键名不能为数字,只能是字符串; session_start(); $_SESSION['a']=1; $_SESSION['b']=2; setcookie(session_name(),session_id(),time()+3600);
<?php //使用URL重写;在php.ini中需要将session.use_cookie改为0 //将session.use_trans_sid 改为1 session_start(); $_SESSION['aaaa']=1111111; $_SESSION['bbbb']=22222; ?> <a href="dump2.php?<?php echo session_name(); ?>= <?php echo session_id();?>" >url format</a> <br/> <a href="dump2.php?<?php echo SID;?>">sid</a>
<?php session_start(); $users=[ 'user1'=>'king1', 'salary'=>12345.65, 'age'=>56, 'course'=>['a','b','history'] ]; $_SESSION=$users;
<?php // 初始化会话。 // 如果要使用会话,别忘了现在就调用: session_start(); // 重置会话中的所有变量 $_SESSION = array(); // 如果要清理的更彻底,那么同时删除会话 cookie // 注意:这样不但销毁了会话中的数据,还同时销毁了会话本身 if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"] ); } // 最后,销毁会话 session_destroy();
<?php session_start(); echo session_id(); var_dump($_SESSION);
<?php session_id($_GET[session_name()]); session_start(); var_dump($_SESSION);