1、HTTP协议

由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。(引自百度百科)总之,客户端通过http协议request发送请求到服务器端,服务器端做出响应response。http协议最大的特点是无连接、无状态。无连接指每次请求响应完连接关闭。设计者的初衷是在互联网大量的访问下避免资源的浪费,随着页面资源的丰富多彩,页面包含图片、视频、文字等信息,每次请求都建立一个连接性能很低效,在后来的HTTP/1.0中以及HTTP/1.1中,引入了重用连接的机制,就是在http请求头中加入Connection: keep-alive来告诉对方这个请求响应完成后不要关闭,下一次咱们还用这个请求继续交流。协议规定HTTP/1.0如果想要保持长连接,需要在请求头中加上Connection: keep-alive,而HTTP/1.1默认是支持长连接的,有没有这个请求头都行。HTTP无状态,是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

2、cookie和session的本质

cookie和session都是针对http协议无状态而提出的一种保存客户端和服务器端保持连接状态的机制。

3、cookie简介

cookie最早是网景公司在93年发明的这样的技术。主要是用来达成客户端和服务器端持续连接的状态,来解决无状态的问题,让服务器知道用户是谁。cookie总是保存在客户端中,根据存储位置可以划分为两类,一种是内存cookie,一种是硬盘cookie。内存cookie是由浏览器保存在内存中,浏览器关闭后就消失了,存在时间短暂。硬盘cookie是存储在硬盘中的,可以设置过期时间,除非用户清理cookie或者时间过期,存储在硬盘中的cookie不会消失,存在时间长期。永久登陆、网站换肤、购物车等可以用cookie实现。

3.1 cookie操作(以php为例)

设置cookie

bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )

setcookie() 定义了 Cookie,会和剩下的 HTTP 头一起发送给客户端。 和其他 HTTP 头一样,必须在脚本产生任意输出之前发送 Cookie(由于协议的限制)。 请在产生任何输出之前(包括 <html><head> 或者空格)调用本函数。

一旦设置 Cookie 后,下次打开页面时可以使用 $_COOKIE 读取。 Cookie 值同样也存在于 $_REQUEST

name

Cookie 名称。

value

Cookie 值。 这个值储存于用户的电脑里,请勿储存敏感信息。 比如 name'cookiename', 可通过 $_COOKIE['cookiename'] 获取它的值。

expire

Cookie 的过期时间。 这是个 Unix 时间戳,即 Unix 纪元以来(格林威治时间 1970 年 1 月 1 日 00:00:00)的秒数。 也就是说,基本可以用 time() 函数的结果加上希望过期的秒数。 或者也可以用 mktime()time()+60*60*24*30 就是设置 Cookie 30 天后过期。 如果设置成零,或者忽略参数, Cookie 会在会话结束时过期(也就是关掉浏览器时)。

Note:

你可能注意到了,expire 使用 Unix 时间戳而非 Wdy, DD-Mon-YYYY HH:MM:SS GMT 这样的日期格式,是因为 PHP 内部作了转换。

path

Cookie 有效的服务器路径。 设置成 '/' 时,Cookie 对整个域名 domain 有效。 如果设置成 '/foo/', Cookie 仅仅对 domain/foo/ 目录及其子目录有效(比如 /foo/bar/)。 默认值是设置 Cookie 时的当前目录。

domain

Cookie 的有效域名/子域名。 设置成子域名(例如 'www.example.com'),会使 Cookie 对这个子域名和它的三级域名有效(例如 w2.www.example.com)。 要让 Cookie 对整个域名有效(包括它的全部子域名),只要设置成域名就可以了(这个例子里是 'example.com')。

旧版浏览器仍然在使用废弃的 » RFC 2109, 需要一个前置的点 . 来匹配所有子域名。

secure

设置这个 Cookie 是否仅仅通过安全的 HTTPS 连接传给客户端。 设置成 TRUE 时,只有安全连接存在时才会设置 Cookie。 如果是在服务器端处理这个需求,程序员需要仅仅在安全连接上发送此类 Cookie (通过 $_SERVER["HTTPS"] 判断)。

httponly

设置成 TRUE,Cookie 仅可通过 HTTP 协议访问。 这意思就是 Cookie 无法通过类似 JavaScript 这样的脚本语言访问。 要有效减少 XSS 攻击时的身份窃取行为,可建议用此设置(虽然不是所有浏览器都支持),不过这个说法经常有争议。 PHP 5.2.0 中添加。 TRUEFALSE

更新cookie

更新cookie和设置cookie用同一个函数即可。需要注意的是cookie的相关参数必须与设置时相同否则更新失败。

查看cookie

cookie数据都会保存在$_COOKIE的超全局数组中

删除cookie

删除cookie同样是使用setcookie()函数,只需将值设为空,过期时间设为当前时间之前的时间比如(time()-1)就可以删除cookie,与更新cookie相同,删除cookie时后面的参数也必须与设置时一致否则是删除不了的。

cookie的常用操作我封装在一个类中方便使用。可以点击查看

4、session简介

Session 是 用于保持状态的基于 Web服务器的方法。Session 允许通过将对象存储在 Web服务器的内存中在整个用户会话过程中保持任何对象。

session的工作原理:

4.1、准备建立会话的时候,php会查看请求中是否包含session_id。如果没有服务器会在自己的内存里创建一个新的变量,这个变量就是session_id.

4.2、服务器会把这个session_id发送到浏览器保存,一般浏览器会把这个id保存在cookie中。

4.3、之后每次浏览器访问服务器的时候,都会携带cookie中存储的这个session_id值,这样服务器就认识这个浏览器了。

4.4、服务端这个session_id的变量就可以存放任意的会话数据,这样数据是经过序列化之后存放进去的。

4.5、每次浏览器访问服务器,都可以凭借的session_id到服务器的这个变量中认领自己的信息

4.6、如果想销毁会话,可以删除会话中的数据,销毁会话文件,默认是存储在文件中的。也可以自定义存储在数据库中或者缓存中。

php中如何使用session

1、开启会话:session_start();

2、可以通过$_SESSION来设置相关值,设置和读取都是用这个全局变量。

3、销毁session session_destory();

这是没设置之前的截图

<?php 

//开启会话
session_start(); header('content-type:text/html;charset=utf-8');
$_SESSION['username']='张三';
$_SESSION['age']=18;
echo 'session的名字:'.session_name().'<br>';
echo 'session的ID:'.session_id(); setcookie(session_name(),session_id(),time()+60*60);

运行这个文件之后,

由于在代码中自己设置了一个cookie设置了过期时间,所以这里有两个cookie

第一次访问后的截图可以看到请求头中是不包含session_id的信息的。

再来看第二次访问的结果:

<?php
session_start();
header('content-type:text/html;charset=utf-8');
var_dump($_SESSION);

服务器会根据sessionid的信息查看文件获取数据。

可以看到文件存储的序列化后的信息。

销毁会话:

<?php
//销毁session步骤
//1、将$_SESSION清除 $_SESSION=[];
//2、将cookie中的sessionid删除 setcookie();
//3、销毁会话 session_destory session_start();
//将$_SESSION 数据清空
$_SESSION=[];
//删除会话cookie
if(ini_get('session.use_cookies')){
$params=session_get_cookie_params();//获取会话 cookie 参数
var_dump($params);
setcookie(session_name(),session_id(),time()-1,$params['path'],$params['domain'],$params['secure'],$params['httponly']);
setcookie(session_name(),session_id(),time()-1);
} //销毁会话
session_destroy();

第一个删除cookie信息是删除默认的cookie信息,第二个是删除自己设置的cookie信息 只删除一个是没用的

至此,session从建立到删除的过程结束。

下面简述下当用户禁用浏览器的cookie时设置session的方法。

原理:只要吧sessionid传递给服务器就可以,因此可以通过url传递值,当然这样没有cookie安全。这里以火狐浏览器为例

首先,禁用浏览器cookie

注意:如果你正在登陆博客的话 操作会让你的登陆注销的。悲催的我写着这篇文章的时候,屏蔽后让我先登录,卧槽,幸亏没有在原页面跳转,不然我一上午的辛苦就白费了,与君共勉。

废话少说,题接上文。

禁用cookie后

<?php
// 当用户禁用cookie下session的使用
session_start();
header('content-type:text/html;charset=utf-8');
$_SESSION['a']='a';
echo "<a href='dump-session.php?".session_name()."=".session_id()."' >查看session</a>";

此时访问后不会再有cookie存储,

而第二次访问时也可以看到,请求头中并没有带入cookie,而由于服务器并没有在浏览器cookie中检测到sessionid值 所以响应头中扔带着sessionid值。

当删除会话时:

<?php
//销毁session步骤
//1、将$_SESSION清除 $_SESSION=[];
//2、将cookie中的sessionid删除 setcookie();
//3、销毁会话 session_destory
session_id($_GET[session_name()]);
session_start();
//将$_SESSION 数据清空
$_SESSION=[];
var_dump(session_id()); //销毁会话
session_destroy();

  省去删掉cookie的步骤。

至此,session、cookie的介绍告一段落,下篇文章会自定义一下会话存储器,以存储到数据库中为例。

session和cookie的知识总结的更多相关文章

  1. session和cookie相关知识总结

    HTTP协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的. 人们很快发现 ...

  2. 知识记录——Session与Cookie

    Session: Session是“会话”的意思,然而,因为http协议是无状态的,那么每次客户端请求服务器端,服务器端都会以“崭新”的页面展示给客户端,这在静态的html页面中是不会存在任何影响,但 ...

  3. Servlet基础知识(三)—— 会话机制Session,Session和Cookie的异同

    Servlet会话机制: Http是一种无状态协议,它是无记忆的.也就是说,服务器不会保存用户的任何信息,当同一用户再次去访问时,服务器是不认识你的,它还是会建立新的连接. 但有时候我们需要服务器保留 ...

  4. 为什么说session依赖cookie,以及cookie的常用知识

    session的用法 session在Flask中通常用做设置某些页面的权限,比如某些页面必须要登录才可以看到,登录的信息或标志就放到session中.它的使用过程如下: 在整个flask工程的启动文 ...

  5. [转]ASP.Net篇之Session与Cookie

    本文转自:http://www.cnblogs.com/japanbbq/archive/2011/08/31/2160494.html Session: Session是“会话”的意思,然而,因为h ...

  6. 关于Cookie的知识的总结

    Cookie的类型 会话cookie和持久cookie 会话cookie是一种临时cookie,它记录了用户访问站点时的设置和偏好,当用户退出浏览器时,会话cookie就会被删除. 持久cookie的 ...

  7. 深入理解Session与Cookie(一)

    Session,Cookie简介: Session和Cookie的作用都是为了保持用户与后端服务器的交互状态,但是各自都有缺陷: Cookie: 随着Cookie的个数的增多和访问量的增加,它占用的网 ...

  8. session and cookie简析

    无状态应用程序(cookies.session等机制出现的背景) Web应用程序服务器通常是“无状态的”: 每个HTTP请求都是独立的; 服务器无法判断2个请求是来自同一个浏览器还是用户. Web服务 ...

  9. 一个Login页面全面了解session与cookie

    背景 做了四年的前端开发,对外一直说自己是web开发,那么身为一个web开发怎能不知道session与cookie以及其管理方式呢~ Login涉及技术栈:Nodejs,MongoDB,Express ...

随机推荐

  1. Red Hat 6.5 网络yum源的配置

    第一次接触Linux系统,用虚拟机安装了一个rad hat6.5版本64位的,傻瓜式安装.安装好之后简单的写了一个C代码,进行gcc编译的时候,提示没有该命令,上网查找了一下说没有安装gcc编译器,用 ...

  2. [SoapUI] Context is per test case, every test case has a different context

  3. Memcached在Windows下的配置和使用(转)

    出处:http://www.cnblogs.com/sunniest/p/4154209.html Memcached学习笔记---- 安装和配置 首先,下载Memcached相关文件. 打开控制台, ...

  4. mongodb新建用户,

    1.用管理 员用户登录mongoDB use hzb_test db.createUser({user: "hzb",pwd: "hzb",roles: [{ ...

  5. Hadoop中Writable类

    1.Writable简单介绍 在前面的博客中,经常出现IntWritable,ByteWritable.....光从字面上,就可以看出,给人的感觉是基本数据类型 和 序列化!在Hadoop中自带的or ...

  6. 使用word 2007 发布csdn博客

    目前大部分的博客作者在写博客这件事情上都会遇到以下3个痛点:1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.2.发布到博客或公众号平台 ...

  7. iOS开发--使用lipo命令制作模拟器与真机通用静态库

    通常在项目中使用静态库的时候都会有两个版本,一个用于模拟器,一个用于真机,因为Mac和iPhone的CPU不同,才造成了这种情况. 为了模拟器与真机之间切换调试的方便,制作通用版本非常有必要. 现在有 ...

  8. 编写高质量代码改善C#程序的157个建议——建议106:为静态类添加静态构造函数

    建议106:为静态类添加静态构造函数 静态类可以拥有构造方法,这就是静态构造方法.静态构造方法与实例构造方法比较有几个自己的特点: 只被执行一次,且在第一次调用类成员之前被运行时执行. 代码无法调用它 ...

  9. 用阿里巴巴官方给Jmeter开发的Dubbo sampler取样器进行dubbo接口测试【图解剖析】

    自:https://blog.csdn.net/cyjs1988/article/details/84258046 [一]Dubbo sampler下载地址: 该插件支持jmeter 3.2及3.2以 ...

  10. Activity Fragment转场动画

    Activity转场动画 先介绍个动画的好例子:https://github.com/lgvalle/Material-Animations Activity的转场动画是通过overridePendi ...