会话控制技术

一、为什么使用会话控制?

web是通过http协议来实现的,而http协议又是无状态的协议,http没有一个内建机制来维护两个事物之间的状态。所有同一个用户请求同一个页面两次的时候,http会把这两次请求隔离开,会当成两次请求的独立。

如果用户执行了登录操作,再次请求页面时http不会认为该用户已经登录过,因此不会保存用户的登录状态,所以不能再不同的页面之间做用户的跟踪和状态的保存。

会话控制就是解决这样的问题的。

思想就是:允许服务器跟踪同一个客户端做出的连续请求,这样就可以保存用户的状态,完成用户的登录状态的保存。

二、会话控制的实现方式

① 通过GET参数进行传递;[不建议使用]

例:用户在1页面完成登录操作,当跳转到2页面时,我们将用户的登录信息继续往下传递,然后在2页面处理的时候就可以判断用户是否执行了登录操作。

存在的问题:

1,信息不安全,所有的信息都会暴露在URL地址中;

2,在传递过程中参数可能会丢失。

cookie的操作:

写操作: setcookie($name, $value, $expire, $path, $domain, $scure );

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 的值。(这个值存储在用户电脑中的,请勿保存敏感和重要信息);

$expire : cookie 的过期时间,时间戳格式。如果设置成0或者忽略此参数,cookie会在会话结束时过期(关系浏览器);

$path : cookie有效的服务器路径,默认值是设置cookie的当前路径;

$domain : cookie的有效域名/子域名;

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

保存cookie为数组形式:setcookie( 'a[b]', $value ); 保存为二维数组

读取cookie : $_COOKIE 就可以了;

删除cookie : setcookie($name, " ", time() - 1000); //设置cookie过期可以了(触发浏览器的删除机制)。

cookie的优缺点:

优点:cookie是存储在客户端中硬盘或者内存中的,不会消耗服务器资源。

缺点:由于所有信息保存在客户端用户的计算机,不建议将一些敏感和重要的信息保存到cookie,而且用户可以禁用cookie,一旦用户禁用cookie就不能获取用户信息了。

③ session 【特别注意:session不是完全脱离cookie的,而是基于cookie的】

工作原理:将使用者相同的信息存储在服务器中的,这样用户无法禁用session的使用,相较于cookie来说安全。session不是脱离cookie的,而是基于cookie的,sessionid是保存在cookie中的,

如果用户禁用了cookie,可以使用URL的方式进行传递sessionID,从而保存session的状态;

session的信息默认是存储在服务器中的文件中,每当用户读取session的内容的时候,首先会拿到浏览器中携带sessionid的cookie,根据sessionID找到对应的session文件,将里面的信息读取出来。

session的操作:

开启session; session_start(); 然后操作这个超全局数组
查看 $_SESSION
销毁session[清空session] ;$_SESSION = []; 或者 $_SESSION = NULL;

删除session文件:session_destroy() 删除session文件并且将sessionID对应的cookie文件也销毁掉;

php.ini 中关于session的配置:

session.auto_start ; 是否自动开启session_start;

session.cookie_domain ; 指定了要设定会话cookie的域名;

session.cookie_lifetime; 值为0时,告知浏览器不要持久化存储cookie数据

session.cookie_path ; 指定了要设置回话cookie的路径 , 默认是/

session.name; 指定回话名,用作cookie的名字,只能有数字和字母组成,默认是 PHPSESSID

session.save_path ; session 文件保存在服务器的路径

session.use_cookie ; 是否在客户端使用cookie传递 sessionID

session.use_trans_sid ; 是否使用传递的方式传递sessionId;

session.save_handler ; 定义了来存储和获取与会话关联的数据的处理器的名字。例如:redis , membean

session.gc_probablity; 与 session.gc_divisor 组合来管理垃圾回收,进程使用概率,默认是1

session.gc_divisor ;

session.gc_divisorsession.gc_probability 合起来定义了在每个会话初始化时启动 gc(garbage collection 垃圾回收)进程的概率。此概率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每个请求中有 1% 的概率启动 gc 进程。session.gc_divisor 默认为 100

session.maxlifetime ; 指定过了多少秒之后数据就会被视为“垃圾”并被清除。垃圾搜集可能会在 session 启动的时候开始 ([默认1440 秒 当前时间戳减去session文件最后修改的时间 超过1440秒的就看做是过期 ] )

session 的优缺点:

优点:session的信息,是存储在服务器的,相对很安全。客户端不可能获取到session数据;

缺点:占用服务器资源,时间长的话,session文件会变大,效率会降低。

【分布式问题:可以将session信息保存到内存服务器中,比如Redis。。。每台web服务器请求时都会去Redis中获取session信息】

传递 sessionID 的问题:

session是基于cookie的,而不是脱离cookie的。sessionID信息保存在cookie中的,如果用户禁用了cookie可以使用session_name()和session_id()来传递sessionID;

方法①:直接使用session_name()和session_id()

 <a href="1.php?"<?php echo session_name()."=".session_id() ?></a>

方法②:使用SID常量【推荐使用】

 <a href="1.php?"<?php echo SID ?></a>

使用SID常量:当开启cookie的时候,SID的值为空;如果没有开启cookie或者用户禁用了cookie的话,SID才是session_name()和session_id()的拼接。所有SID常量比较智能,建议使用。

session存储问题:

假如使用多台web服务器,其中一台存储了sessionid的信息。当轮询的时候可能被分配到另一台web服务器,此时这台服务器中不会找到sessionid 对应的信息。。。

解决方法:

可以将session信息保存到Redis等内存服务器中,每次轮询时都去Redis中拿sessionID对应的session信息就解决此问题了。

session_set_save_handler():可以自定义session会话存储函数;

 

充分理解cookie和session的工作原理,和两者的区别!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容