session 的工作原理与session用法

先来看一个session实例

 代码如下 复制代码

function getsessiondata ($session_name = 'php教程sessid', $session_save_handler = 'files') {
    $session_data = array();
    # did we get told what the old session id was? we can't continue it without that info
    if (array_key_exists($session_name, $_cookie)) {
        # save current session id
        $session_id = $_cookie[$session_name];
        $old_session_id = session_id();
       
        # write and close current session
        session_write_close();
       
        # grab old save handler, and switch to files
        $old_session_save_handler = ini_get('session.save_handler');
        ini_set('session.save_handler', $session_save_handler);
       
        # now we can switch the session over, capturing the old session name
        $old_session_name = session_name($session_name);
        session_id($session_id);
        session_start();
       
        # get the desired session data
        $session_data = $_session;
       
        # close this session, switch back to the original handler, then restart the old session
        session_write_close();
        ini_set('session.save_handler', $old_session_save_handler);
        session_name($old_session_name);
        session_id($old_session_id);
        session_start();
    }
   
    # now return the data we just retrieved
    return $session_data;
}

 

再看session原理
一直在使用session存储数据,一直没有好好总结一下session的使用方式以及其工作原理,今天在这里做一下梳理。
这里的介绍主要是基于php语言,其他的语言操作可能会有差别,但基本的原理不变。

1.在php中如何操作session:
session_start();   //使用该函数打开session功能
$_session       //使用预定义全局变量操作数据
使用unset($_session['key']) //销毁一个session的值
简单地操作,一切都是由服务器实现;由于处理在后台,一切看起来也很安全。但是session采用什么样机制,又是怎样被实现,并且如何来保持会话的状态的呢?

2.session实现与工作原理
浏览器和服务器采用http无状态的通讯,为了保持客户端的状态,使用session来达到这个目的。然而服务端是怎么样标示不同的客户端或用户呢?
这里我们可以使用生活中的一个例子,假如你参加一个晚会,认识了很多人,你会采取什么方式来区分不同的人呢!你可能根据脸型,也有可能根据用户的名字,
或者人的身份证,即采用一个独一无二的标示。在session机制中,也采用了这样的一个唯一的session_id来标示不同的用户,不同的是:浏览器每次请求都会带上
由服务器为它生成的session_id.
简单介绍一下流程:当客户端访问服务器时,服务器根据需求设置session,将会话信息保存在服务器上,同时将标示session的session_id传递给客户端浏览器,
浏览器将这个session_id保存在内存中(还有其他的存储方式,例如写在url中),我们称之为无过期时间的cookie。浏览器关闭后,这个cookie就清掉了,它不会存在用户的cookie临时文件。
以后浏览器每次请求都会额外加上这个参数值,再服务器根据这个session_id,就能取得客户端的数据状态。
如果客户端浏览器意外关闭,服务器保存的session数据不是立即释放,此时数据还会存在,只要我们知道那个session_id,就可以继续通过请求获得此session的信息;但是这个时候后台的session还存在,但是session的保存有一个过期
时间,一旦超过规定时间没有客户端请求时,他就会清除这个session。
下面介绍一下session的存储机制,默认的session是保存在files中,即以文件的方式保存session数据。在php中主要根据php.ini的配置session.save_handler
来选择保存session的方式。
这里顺便说明一下,如果要做服务器的lvs,即多台server的话,我们一般使用memcached的方式session,否则会导致一些请求找不到session。
一个简单的memcache配置:
session.save_handler = memcache
session.save_path = "tcp://10.28.41.84:10001"
当然如果一定要使用files文件缓存,我们可以将文件作nfs,将所有的保存session文件定位到一个地方。
刚才讲返回给用户的session-id最终保存在内存中,这里我们也可以设置参数将其保存在用户的url中。

3.实例问题
现有系统a,b; 假设a系统是可以独立运行的web系统,即可以和浏览器直接处理session, b系统是基于mobile的,需要调用a系统的功能接口,
在保持a不改变的情况下,即登陆验证,session存储都不变的情况下,b系统能处理前端用户的请求。
这里提供的方案是使用php实现
在用户登陆成功后,将保存的session的session-id返回给b系统,然后B系统每次请求其他接口都带session_id。
A系统在session_start前加上session_id(session_id);
这样b系统就能安全的调用a

session函数还有

session_cache_expire — return current cache expire
session_cache_limiter — get and/or set the current cache limiter
session_commit — alias of session_write_close
session_decode — decodes session data from a string
session_destroy — destroys all data registered to a session
session_encode — encodes the current session data as a string
session_get_cookie_params — get the session cookie parameters
session_id — get and/or set the current session id
session_is_registered — find out whether a global variable is registered in a session
session_module_name — get and/or set the current session module
session_name — get and/or set the current session name
session_regenerate_id — update the current session id with a newly generated one
session_register — register one or more global variables with the current session
session_save_path — get and/or set the current session save path
session_set_cookie_params — set the session cookie parameters
session_set_save_handler — sets user-level session storage functions
session_start — initialize session data
session_unregister — unregister a global variable from the current session
session_unset — free all session variables
session_write_close — write session data and end session

时间: 2024-10-27 19:13:07

session 的工作原理与session用法的相关文章

HTTP Session 的工作原理以及几个思维扩展

大家都知道,HTTP 协议本身是无状态的,Session 的出现解决了这个问题,也被大多数 Web 端采用. 但它背后的实现原理你是否有兴趣了解呢,以及在它基础上的思维发散,和你聊聊. 无状态的 HTTP 大家都知道,我们目前使用的互联网应用层协议基本上都是基于 HTTP 和 HTTPS 的,它们的本身是无状态的, 只负责请求和响应. 我告诉服务器我需要什么,服务器返回给我相应的资源. 如果没有额外处理的话, 服务器是不知道你是谁,更无法根据你是谁给你展现和你相关的内容了. HTTP 协议一开始

简单易懂,Session的工作方式(转)

session   下面我们来看一下Session是如何工作的.不知你是否知道通过Cookie来实现身份认证的吧.首先生成一个独一无二的Cookie作为用户身份的标志,并在数据库中进行注册.然后通过用户传递来的Cookie和数据库中注册的Cookie进行对照以确定用户的身份.   Session的工作原理也是这样.   首先,PHP为建立Session的用户产生一个独一无二的字符串,用来标志这个用户的session.一般将这个字符串称作Session Id.然后"sess"+Sessi

Session的工作方式

下面我们来看一下Session是如何工作的.不知你是否知道通过Cookie来实现身份认证的吧.首先生成一个独一无二的Cookie作为用户身份的标志,并在数据库中进行注册.然后通过用户传递来的Cookie和数据库中注册的Cookie进行对照以确定用户的身份.   Session的工作原理也是这样.   首先,PHP为建立Session的用户产生一个独一无二的字符串,用来标志这个用户的session.一般将这个字符串称作Session Id.然后"sess"+Session Id为文件名(

php中Session工作原理与用法详解

1.什么是Session 2.Session从用户访问页面开始,到断开与网站连接为止,形成一个会话的生命周期.在会话期间,分配客户唯一的一个SessionID,用来标识当前用户,与其他用户进行区分. 3.Session会话时,SessionID会分别保存在客户端和服务器端两个位置,对于客户端使用临时的Cookie保存(Cookie名称为PHPSESSID)或者通过URL字符串传递,服务器端也以文本文件形式保存在指定的Session目录中. 4.Session通过ID接受每一个访问请求,从而识别当

ASP中Session的运作原理

写过稍微大型一点 ASP 的人都知道,Session 这个对象真是好用,它可以用来记录使用者私有的资料变量,既安全又方便.但是你真的知道 Session 的运作原理吗?或许了解以后,你就再也不太敢使用这个令人又爱又恨的对象.虽然转而替代之的方法稍嫌麻烦,但在长期考量之下,也就不得不这么做了. 首先来讲讲 Session 的好处,它可以用来记录客户端私有的资料变量,并且在时间范围内不会消失.这真的是很重要的功能,尤其是有会员的系统必须要用到的.像是会员的登入帐号.时间.状态以及许许多多该记录的实时

PHP中怎样保持SESSION不过期 原理及方案介绍_php技巧

PHP中如何保持SESSION以及由此引发的一些思考  最近的一个项目,里面有一个比较大的表单,用户完成它需要很多时间,很多用户花了千辛万苦完成之后,一提交发现SESSION过期,系统退出了,所以引起了研究如何设置SESSION以及保持SESSION在线的需要,下面是一些心得体会. 什么是SESSION?按照WIKI的解释,SESSION是存在于两个通信设备间的交互信息,在某一时间建立,经过一定的时间后失效.常见的SESSION有:TCP SESSION.WEB SESSION(HTTP SES

Session的工作机制详解和安全性问题(PHP实例讲解)_php实例

我们先简单的了解一些http的知识,从而理解该协议的无状态特性.然后,学习一些关于cookie的基本操作.最后,我会一步步阐述如何使用一些简单,高效的方法来提高你的php应用程序的安全性以及稳定行. 我想大多数的php初级程序员一定会认为php默认的session机制的安全性似乎是有一定保障的,事实恰好相反 – php团队只是提供了一套便捷的session的解决方案提供给程序员使用,至于安全性的话,应该由程序员来加强,这是应用程序开发团队的责任.因为,这里面的方法很多,可以这么说吧,没有最好,只

Yii中srbac权限扩展模块工作原理与用法分析_php实例

本文实例讲述了Yii中srbac权限扩展模块工作原理与用法.分享给大家供大家参考,具体如下: 1. 设置权限规则表:可放在module模块配置文件里面 public function init() { //操作权限表,必须存在以下字段: //itemname角色名/ID, //type授权项目类型/1(任务)或者2(角色), //bizrule权限/逻辑运算表达式为false是有权限操作, //data数据/YII暂无利用 Yii::app()->authManager->itemTable

解析php中session的实现原理以及大网站应用应注意的问题_php技巧

PHP SESSION原理我们知道,session是在服务器端保持用户会话数据的一种方法,对应的cookie是 在客户端保持用户数据.HTTP协议是一种无状态协议,服务器响应完之后就失去了与浏览器的联系,最早,Netscape将cookie引入浏览器,使得 数据可以客户端跨页面交换,那么服务器是如何记住众多用户的会话数据呢? 首先要将客户端和服务器端建立一一联系,每个客户 端都得有一个唯一标识,这样服务器才能识别出来.建议唯一标识的方法有两种:cookie或者通过GET方式指定.默认配置的PHP