Blogger Information
Blog 4
fans 0
comment 0
visits 4342
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
cookie与session详解
太平洋警察的博客
Original
908 people have browsed it

session与cookie是什么?

session与cookie属于一种会话控制技术.常用在身份识别,登录验证,数据传输等.举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优惠.这时候,我们怎么识别这个会员卡真实有效的呢?当我们将会员号给到收银员,收银员根据我们提供的会员号,输入到系统中,系统根据这个会员号去查询,如果查询到了就证明这个会员号是真实存在的.这里的会员号就好比cookie与session.会员系统就好比服务器端,收银员就好比客户端.

为什么会用到session与cookie呢?

根据上述的例子,我们知道session与cookie是可以干什么的了,那为什么必须用这个来实现呢?这里就有必要了解一下http应用传输协议的特点了。由于http协议是无状态的,即浏览器去请求了一个网页,这时候就是一个http请求,当服务端接收到请求之后,返回客户端需要的数据,在这过程中浏览器与服务器是建立了一个连接的。但是当服务端返回数据,客户端收到数据之后,他们的这种连接关系就断开了。下次浏览器再去发送请求的时候,又是重新建立一个连接,这两个链接没有任何关系。试想一下,当我们登录一个商场系统的时候,进入首页做了登录操作,但是我们下单或者加入购物车的时候,还需要登录,每访问一个页面就要登录,是不是很繁琐同时也是很不科学的,万一我们加入购物车的商品,我们点击下单了,下单页面要登录而且还无法正确的反馈出你下单时的那些商品.

Http特点

1.http协议支持客户端/服务端模式,也是一种请求/响应模式的协议。 2.无连接。所谓的无连接就是服务器收到了客户端的请求之后,响应完成并收到客户端的应答之后,即断开连接。限制每次的连接只处理一次请求。从而节省传输时间。 3.无状态。http协议对事务的处理没有记忆能力。也就意味着如果需要前面的信息,只能重传,这无形之中增加数据的传输量。这种方式某种方面上讲解放了服务器,但是却不利于客户端与服务器的连接。为了弥补这种不足,产生了两项记录http状态的技术,一个叫做Cookie,一个叫做Session,后面我们再细讲它们。 4.简单快捷:所谓的简单快捷是指客户端向服务器请求服务时,一般来说只需要传输请求方法和路径,就能进行访问 5.灵活:这里主要指的是客户端可以通过http协议传输任意类型的数据。比如传输.jpg文件、.ppt文件等等,只需要设定content-type就可以进行传输。

Cookie

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序列号. .有时候,我们可能遇到这种情况,我们在这个页面设置了cookie,但是去刷新页面获取cookie,按理说是会获取到cookie的,但实际情况是无法获取到,这是由于cookie运行机制导致,PHP创建了cookie这个指令,告诉浏览器,你需要执行这个指令了,这时候浏览器才会去执行这个指令,因此是无法获取到cookie的.. 在设置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传输的数据量大了,带了的带宽消耗就大.

Session

运行原理与存储机制

. 运行原理 1.客户端向服务端发起请求,建立通信 2.服务端根据设置的session创建指令,在服务端创建一个编号为sessionid的文件,里面的值就是session具体的值(组成部分 变量名 | 类型 :长度:值). 3.服务端将创建好的sessionid编号响应给客户端,客户则将该编号存在cookie中(一般我们在浏览器存储的调试栏中会发现cookie中有一个PHPSESSID的键,这就是sessionid,当然这个名称,我可以通过设置服务端是可以改变的). .当下一次请求时,客户端将这个sessionid携带在请求中,发送给服务端,服务端根据这个sessionid来做一些业务判断.

.存储机制 1.存储方式.session默认是文件存储的.我们可以通过php.ini的配置来设置存储驱动传送门2.生命周期.当我们未设置session的生命周期时,当浏览器关闭之后存储在客户端的phpsessid自动消失,因为它是存在内存,下次建立连接的时候会重新创建一个phpsessid.之前的session,PHP会自动的根据***回收机制自动删除.这里我们可以根据sessionsetcookie_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的管理机制是不是一样.


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post