session会话机制,常用来做用户登录状态验证,偶尔也用作信息临时存储
大部分对于session的理解较为基础,比如下面常用的方法:
session_start(); //开启session()
$_SESSION['name']="name保存在session中"; //赋值
echo $_SESSION['name']; //输出session
session_destroy(); //清除所有session
...
这些方法只针对同域,假如涉及到跨域时,每次会话请求,需要通过首次会话生成的session_id,再次启动会话
session_start($session_id); //session_id为客户端指定
上文的session_id需要通过传递才可以,可以当做参数,也可以放到header中等等
假如不想每次都明文传输session_id,还有没有办法回到指定会话呢?启动会话前,通过PHP的“ini_set”函数设置session_name的值,可以通过下面这段话理解(摘自网络),非常有用,一定要仔细阅读理解
首先访问开启session的程序后,在Cookie中会新建一个值,键名为PHPSESSID,键值为一串随机的字符串,其中键名是由session.name决定的,如果不设置,默认为PHPSESSID
新建了一个session之后,服务器会将会话信息存储在tmp目录中,文件名为PHPSESSID_<'value>,其中value的值即为浏览器中PHPSESSID的值
在这个文件中,会将session信息分为两部分存储,一个是服务器代码中设置session的键名,另一个为session的键值,中间用竖线|隔开
为此,我特意做了个测试
直接访问一个页面,开启session,并赋个值
ini_set('session.name', 'PHP_SID');
session_start();
$_SESSION['test']='session测试';
echo session_id();
var_dump($_SESSION);exit;
然后注释掉session赋值的代码,把上面的session_id存储到页面的cookie中,key为“PHP_SID”使用ajax请求此代码,请求时一定要携带cookie
这时就会看到上文session所定义的“session测试”
划重点:
实际本文所要说的,就是在开启session_start()之前,定义:ini_set('session.name','PHP_SID');
前端cookie中定义好“PHP_SID=session_id”
请求时携带cookie,这样即可找到已存在的会话