PHP会话控制中session的使用
简单介绍
基本功能:
通过为每个独立用户分配唯一的会话 ID,可以实现针对不同用户分别存储数据的功能。 会话通常被用来在多个页面请求之间保存及共享信息。一般来说,会话 ID 通过 cookie 的方式发送到浏览器,并且在服务器端也是通过会话 ID 来取回会话中的数据。 如果请求中不包含会话ID 信息,那么 PHP 就会创建一个新的会话,并为新创建的会话分配新的 ID。【摘自官方文档】
简单来说其作用类似于cookies但是相比较cookies更加安全。cookies保存在用户的浏览器上,用户可以非常方便的更改,然而session保存在服务器,用户只会拿到一个ID(session_id)号因此用户不能直接修改session中保存的信息。
工作流程
当开始一个会话时,PHP 会尝试从请求中查找会话 ID (通常通过会话 cookie), 如果请求中不包含会话 ID 信息,PHP 就会创建一个新的会话。 会话开始之后,PHP 就会将会话中的数据设置到 $_SESSION 变量中。 当 PHP 停止的时候,它会自动读取 $_SESSION 中的内容,并将其进行序列化, 然后发送给会话保存管理器来进行保存。PHP 脚本执行完毕之后,会话会自动关闭。 同时,也可以通过调用函数 session_write_close() 来手动关闭会话。 【摘自官方文档】
①接受用户请求,并查询ID(session_id)。
②如果ID(session_id)存在,则开始会话;如果不存在则创建一个新会话,之后开启会话
③PHP从会话中获取相关数据经过反序列化后保存到$_SESSION
中。
④PHP结束前将$_SESSION
经序列化后提交给管理器。
⑤结束会话。
常见配置
session.save_handler : 修改默认会话保存机制(默认状态是以文件形式保存到某个路径下,可以修改session_set_save_handler来把session保存到数据库)
session.save_path:session文件的保存位置。如图:
session.auto_start : 会话自动开启,默认是0表示不开启,修改为1表示开启。PHP代码中可以调用session.start()手动开启。
session.name: session的名字,默认PHPSESSID
session.gc_maxlifetime: session的最长有效期,以ms为单位。如果超过这个时间sessio将自动删除。默认是1440(24分钟)
serialize_handler: 默认PHP,处理连续资料的方式,本功能只有WDDX模组或PHP内部使用【说人话就是用WDDX还是PHP格式来序列化得出session存储的字符串】注意如果这里的序列化方式是PHP那么就可能会出现反序列化漏洞。
session.gc_probability = n: 以千分之n的概率回收(删除)session
其他:Session 上传进度
当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,上传进度可以在$_SESSION中获得。
当 session.upload_progress.enabled INI 选项开启时,PHP 能够在每一个文件上传时监测上传进度。
这个信息对上传请求自身并没有什么帮助,但在文件上传时应用可以发送一个POST请求到终端(例如通过XHR)来检查这个状态当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,上传进度可以在 S E S S I O N 中 获 得 。 当 P H P 检 测 到 这 种 P O S T 请 求 时 , 它 会 在 _SESSION中获得。 当PHP检测到这种POST请求时,它会在 SESSION中获得。当PHP检测到这种POST请求时,它会在_SESSION中添加一组数据, 索引是
session.upload_progress.prefix 与 session.upload_progress.name连接在一起的值。
通常这些键值可以通过读取INI设置来获得
利用session实现登陆后在页面之间的切换
一共设置了五个页面
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="Login" content="width=3, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="./login.php" method="post">
<p>登录</p>
<p>账号:<input type="text" name="name" id="" /></p>
<p>密码:<input type="password" name="passwd" id=""/></p>
<input type="submit" value="登录">
</form>
</body>
</html>
login.php
<?php
header("content-type:text/html;charset=utf-8");
if($_POST['name']=='admin' && $_POST['passwd']=='passwd'){
session_start();
$_SESSION['user']['islogin']="true";
$_SESSION['user']['username']=$_POST['name'];
echo "<script>alert('登录成功');location='./index.php'</script>";
}
else{
echo $_POST['name'];
echo "登录失败!";
}
index.php:
<?PHP
session_start();
header("content-type:text/html;charset=utf-8");
//phpinfo();
if(isset($_SESSION['user']['islogin']) && $_SESSION['user']['islogin'] == true){
echo "Hi ".$_SESSION['user']['username'].",欢迎您的到来index.php!<br>";
echo "<a href='a.php'>前往页面a</a><br>";
echo "<a href='b.php'>前往页面b</a><br>";
echo "<a href='logout.php'>退出登录</a><br>";
print_r($_SESSION);
}else{
echo "你无权访问,请登录(3s后跳转。。。)";
echo "<meta http-equiv='refresh' content='3;url=./login.html'/>";
}
logout.php:
<?PHP
session_start();
header("content-type:text/html;charset=utf-8");
//phpinfo();
if(isset($_SESSION['user']['islogin']) && $_SESSION['user']['islogin'] == true){
$_SESSION['user']=array();//把当前user幸喜置空
setcookie(session_name(),null,time()-1,'/');//把存在cookie里的session_id给删了
session_destroy();//删除服务器上的session(文件)
echo "即将返回登录页面。。。";
echo "<meta http-equiv='refresh' content='2;url=./login.html'/>";
}else{
echo "你无权访问,请登录(3s后跳转。。。)";
echo "<meta http-equiv='refresh' content='3;url=./login.html'/>";
}
a.php和b.php基本一致
<?php
session_start();
header("content-type:text/html;charset=utf-8");
if(isset($_SESSION['user']['islogin']) && $_SESSION['user']['islogin'] == true){
echo "Hi ".$_SESSION['user']['username'].",欢迎您的到来a.php!<br>";
echo "<a href='index.php'>前往页面index</a><br>";
echo "<a href='b.php'>前往页面b</a><br>";
echo "<a href='logout.php'>退出登录</a><br>";
}
else{
echo $_POST['name'];
echo "你无权访问该页面!";
}
上一篇: Express 的基本使用(创建一个简单的服务器)
下一篇: 原生js实现下载导出Excel