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那么就可能会出现反序列化漏洞因为php中serialize()的方式和其不同。详情请见=>【链接】

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同名变量时,上传进度可以在$_SESSION中获得。
当PHP检测到这种POST请求时,它会在$_SESSION中添加一组数据, 索引是
session.upload_progress.prefixsession.upload_progress.name连接在一起的值key。
通常这些键值可以通过读取INI设置来获得
【PS:$SESSION获得的是key与文件名连接而成的字符串】

利用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 "你无权访问该页面!";
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值