session与cookie是什么?php
session与cookie属于一种会话控制技术.经常使用在身份识别,登陆验证,数据传输等.举个例子,就像咱们去超市买东西结帐的时候,咱们要拿出咱们的会员卡才会获取优惠.这时候,咱们怎么识别这个会员卡真实有效的呢?当咱们将会员号给到收银员,收银员根据咱们提供的会员号,输入到系统中,系统根据这个会员号去查询,若是查询到了就证实这个会员号是真实存在的.这里的会员号就比如cookie与session.会员系统就比如服务器端,收银员就比如客户端.html
为何会用到session与cookie呢?前端
根据上述的例子,咱们知道session与cookie是能够干什么的了,那为何必须用这个来实现呢?这里就有必要了解一下http应用传输协议的特色了。因为http协议是无状态的,即浏览器去请求了一个网页,这时候就是一个http请求,当服务端接收到请求以后,返回客户端须要的数据,在这过程当中浏览器与服务器是创建了一个链接的。可是当服务端返回数据,客户端收到数据以后,他们的这种链接关系就断开了。下次浏览器再去发送请求的时候,又是从新创建一个链接,这两个连接没有任何关系。试想一下,当咱们登陆一个商场系统的时候,进入首页作了登陆操做,可是咱们下单或者加入购物车的时候,还须要登陆,每访问一个页面就要登陆,是否是很繁琐同时也是很不科学的,万一咱们加入购物车的商品,咱们点击下单了,下单页面要登陆并且还没法正确的反馈出你下单时的那些商品.web
1.http协议支持客户端/服务端模式,也是一种请求/响应模式的协议。 2.无链接。所谓的无链接就是服务器收到了客户端的请求以后,响应完成并收到客户端的应答以后,即断开链接。限制每次的链接只处理一次请求。从而节省传输时间。 3.无状态。http协议对事务的处理没有记忆能力。也就意味着若是须要前面的信息,只能重传,这无形之中增长数据的传输量。这种方式某种方面上讲解放了服务器,可是却不利于客户端与服务器的链接。为了弥补这种不足,产生了两项记录http状态的技术,一个叫作Cookie,一个叫作Session,后面咱们再细讲它们。 4.简单快捷:所谓的简单快捷是指客户端向服务器请求服务时,通常来讲只须要传输请求方法和路径,就能进行访问 5.灵活:这里主要指的是客户端能够经过http协议传输任意类型的数据。好比传输.jpg文件、.ppt文件等等,只须要设定content-type就能够进行传输。ajax
cookie的基本概念算法
cookie是远程浏览器存储数据以此追踪用户和识别用户的的机制,从实现来讲,cookie是存储在客户端上的一个数据片断。编程
cookie的运行原理与存储机制跨域
.运行原理 1.客户端向服务端发起一个http请求. 2.服务端设置一个建立cookie的指令,响应给客户端. 3.客户端收到服务端响应的指令,根据指令在客户端建立一个cookie. 4.挡下一次请求时,客户端携带这个cookie向服务端发送请求. .存储机制 总的来讲,cookie在客户端存储的形式有三种,不一样的浏览器的存储机制不一样,存的cookie也不一样. 1.文件存储.浏览器会针对不一样的域,在磁盘的对应目录建立一个单独的文件,来存储该域下面的cookie值. 2.内存存储.当浏览器关闭时,该cookie随之消失.根据下面的建立语法,当咱们未设置过时时间时则会出现这种状况. 3.flash存储.这种存储方式是永久存储在磁盘中,即便经过浏览器删除一些数据都是没法删除该方式存储的cookie,若是须要删除,可能经过磁盘的方式.浏览器
cookie的设置安全
Bool setcookie(string $name[, string $values, $expire=0[,string $path[,string $domain[, bool $secure = false[, bool $httpOnly = false]]]]] ); $name:cookie存储的名称,必填选项. $values:cookie存储的值。这里须要注意的是,当把该值设置为false时,客户端会尝试删除这个cookie值,所以在要将值这是为true或者false的时候,咱们用另外的值来代替,例如true用1代替,false用0来代替. $expire:cookie的过时时间,秒为单位,当该值被设置时,定时删除;当该值没有设置时,该值是永久有效的.该值设置为小于当前时间时,会出发浏览器的删除机制,会自动删除cookie. $path:cookie有效的目录,默认的目录是"/",即表示当前的正个域名都生效. $domain:cookie的做用域名,默认的是当前域名有效,若是须要设置直接填写生效的域名便可.须要注意的是IE浏览器有长度限制,当只有大于5的时候才会生效. $secure:cookie的加密处理,当设置为true的时候,须要使用HTTPS协议,才会生效. $httpOnly:决定cookie是否只使用http协议,当设置为1或者true,其余非http协议是没法操做cookie的。例如咱们未设置的时候,咱们JavaScript是能够对cookie进行设置的.这样必定程度上保证了安全性.这种状况需考虑浏览器是否支持该配置项.
. 设置cookie的函数还有setrawcookie()函数,只不过该函数不会对值 进行urlencode序列号. .<font color="red">有时候,咱们可能遇到这种状况,咱们在这个页面设置了cookie,可是去刷新页面获取cookie,按理说是会获取到cookie的,但实际状况是没法获取到,这是因为cookie运行机制致使,PHP建立了cookie这个指令,告诉浏览器,你须要执行这个指令了,这时候浏览器才会去执行这个指令,所以是没法获取到cookie的.</font> . 在设置cookie以前,不能有任何输出.
// 实现方式一 setcookie($cookie,"hello,world!", 3600); // 实现方式二 header("header("Set-Cookie: testcookie=中文; path=/; domain=.sunphp.org; expires=".gmstrftime("%A, %d-%b-%Y %H:%M:%S GMT",time()+9600));"); // 两则的做用是同样的,setcookie是PHP内置函数,是对http协议的操做封装。
cookie的获取
$_COOKIE['$cookeName'];
cookie的应用
. 用户身份识别 . 数据传输 . 登陆控制(是否登陆、单点登陆)
cookie跨域设置
咱们都知道,在前端开发中时常会遇到ajax跨域问题,咱们解决的方式有不少种,能够参考这篇文章传送门1,传送门2,cookie跨域咱们能够参考p3p传输协议传送门
cookie使用的注意事项
.数量限制,客户端对每个domian下的cookie是有数量限制的,不是建立任意数量就行. .安全性,根据上面的建立语法,咱们能够得知,当咱们未设置$httpOnly值得时候,非http协议是能够操做cookie的值的,例如JavaScript经过cookie($cookieName).并且一些抓包工具也是能够抓取到cookie的,还有就是cookie存储在客户端的文件中,若是获取到这个cookie,也是能够对cookie作一些操做的.为了防止别人能够拷贝cookie文件,进行恶意操做,能够对cookie进行加密处理. 数据传输:当cookie数量不少,数据很大的时候,其实对于带宽是有消耗的.比较http传输都须要带宽,当http传输的数据量大了,带了的带宽消耗就大.
运行原理与存储机制
. 运行原理 1.客户端向服务端发起请求,创建通讯 2.服务端根据设置的session建立指令,在服务端建立一个编号为sessionid的文件,里面的值就是session具体的值(组成部分 变量名 | 类型 :长度:值). 3.服务端将建立好的sessionid编号响应给客户端,客户则将该编号存在cookie中(通常咱们在浏览器存储的调试栏中会发现cookie中有一个PHPSESSID的键,这就是sessionid,固然这个名称,我能够经过设置服务端是能够改变的). .当下一次请求时,客户端将这个sessionid携带在请求中,发送给服务端,服务端根据这个sessionid来作一些业务判断.
.存储机制 1.存储方式.session默认是文件存储的.咱们能够经过php.ini的配置来设置存储驱动传送门 2.生命周期.当咱们未设置session的生命周期时,当浏览器关闭以后存储在客户端的phpsessid自动消失,由于它是存在内存,下次创建链接的时候会从新建立一个phpsessid.以前的session,PHP会自动的根据垃圾回收机制自动删除.这里咱们能够根据session_set_cookie_params($expire)函数来设置一个生命周期;
session的设置
session_start(); $_SESSION = $values;
. session_start()设置以前,不能有任何输出
session的获取
$_SESSION['values'];
session的使用场景
. 用户身份识别 . 数据传输 . 登陆控制(是否登陆、单点登陆)
session的注意事项
.安全性,sessionid是按照必定的算法生成,要保证session的值惟一性和随机性. .客户端禁用cookie,根据上面session的运行原理能够得出,session的存储于传送仍是依赖于客户端,所以当客户端禁用cookie时,客户端是没法保存PHPSESSID的,这时候能够经过url重写或者表单来实现session的传输. .存储优化,按照上面的session建立,全部的session都会建立在一个目录下面,同时有的无效session在垃圾回收机制时间内还不会删除,当一台服务器配置的站点较多时,这时候会生成不少的session文件,致使咱们读取速度变慢,咱们能够设置session的存储目录级别,save_path函数.通常大型的项目(如分布式的项目),可使用其余的存储方式,如数据存储,内存存储.
session与cookie的区别
. session存储在服务端,cookie存储在客户端. .cookie的建立指令由服务端设置. .session的sessionid须要客户端存储.
cookie与session的几个误区
.客户端禁止cookie,session没法使用?
使用url重写或者表单提交能够实现.
.session和cookie的安全性比较,session存在客户端安全更高?
因为cookie是存在客户端的,相对来讲安全性是要低一些,不过在建立的时候能够设置$httpOnly值. 因为cookie与session是相互关联的,获取到cookie必定程度上获取到了session,一样能够操做session.
.cookie与session是否是在浏览器关闭的时候会消失?
这须要查看存储机制了。cookie能够存文件,内存,flash.存内存固然浏览器关闭则消失了;session因为垃圾回收机制,当在垃圾回收机制内是不会删除的,除非你代码中显示的作了删除操做.
.cookie是存储在客户端中,如何增长其安全性?
咱们能够在设置cookie的时候,增长一些特殊参数,如客户端信息ip、浏览器信息等.
.当cookie存在客户端的文件中,是否是每一个浏览器获取到这个文件均可以进行操做?
要看浏览器之间对cookie的管理机制是否是同样.
原文转自,公众号编程每日.