PHP cookie 与 session
PHP cookie
- cookie 是存储在本地的数据文本
- cookie 文本大小不超过 4K 不能存储大量数据
- cookie 安全性不好 一般不存储敏感信息
- 使用 setcookie()函数对 cookie 进行操作 其可选属性有:
- name:cookie 的变量名
- value:cookie 变量的值
- expire:cookie 的失效时间 单位是秒
- path:cookie 在服务器端的有效路径
- domain:cookie 有效的域名
- secure:cookie 是否在 https 下有效
<?php
//创建名为username的cookie 其值为root 有效期为浏览器关闭前
setcookie('username', 'root');
//读取cookie
echo $_COOKIE['username'];
//删除cookie
//将cookie的失效时间设置成小于系统的当前时间
setcookie('username', '', 0);
PHP session
- session 是存储在服务器端的数据文本
- session 没有存储大小限制
- 使用 session 一般有以下步骤
- 启动会话:方法 1.将
session_start()
写在页面最开始;方法 2.在 php.ini 文件中修改session.auto_start
使值为 1. - 存储会话:直接使用
$_SESSION['var_name'] = 'value'
存储名为 var_name 值为 value 的 session 变量 - 读取会话:
$val = $_SESSION['var_name']
直接读取 session 中的 var_name 的值 - 删除会话:
- 删除单个会话:
unset($_SESSION['var_name'])
直接注销名为 var_name 的 session 变量 - 删除多个会话:
$_SESSION = array()
将空数组赋值给 session 那么 session 中不再有任何数据 - 结束当前会话:
session_destory()
将服务器中的 session 文件删除掉
- 删除单个会话:
- 启动会话:方法 1.将
<?php
//启动会话 写在php文本的最前面
// session_start();
//存储会话
$_SESSION['username'] = 'root';
$_SESSION['password'] = 'poot';
//读取会话
$userName = $_SESSION['username'];
echo $userName;
//删除会话
//删除单个会话username
unset($_SESSION['username']);
//删除所有会话
$_SESSION = array();
//结束当前会话
session_destroy();
使用 cookie 实现用户 7 天自动登录
- login.php 登录选择页面
<?php
function direct_login(){
setcookie('username', $_COOKIE['username'], time()+604800); //重置7天时间
setcookie('isLogin', 1);
setcookie('isCheck', 1);
header('Location:index.php'); //直接进入主页 免登录
}
function new_account_login(){
setcookie('username', '', 0);
setcookie('isLogin', '', 0);
setcookie('isCheck', '', 0);
header('Location:login_new.php'); //跳转到登录页面
}
//判断本地是否有用户登录过的cookie
if(isset($_COOKIE['username'])){
//选择是否使用新账号登录
if($_POST['old_account']){ //免密直接登录
direct_login();
}else if($_POST['new_account']){ //新账号登录
new_account_login();
}
}else{ //本地没有用户登录过的cookie
new_account_login();
}
//退出登录
if($_GET["action"] == 'quit'){
if(empty($_COOKIE['isCheck'])){ //没有选择7天免登录
new_account_login();
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>用户登录</title>
<style>
*{
padding: 0;
margin: 0;
box-sizing: border-box;
}
form{
margin: 60px auto;
max-width: 400px;
height: 110px;
border: 5px solid green;
display: flex;
flex-flow: column nowrap;
align-items: center;
}
form > input{
width: 280px;
height: 40px;
margin: 10px;
background-color: white;
border: 1px solid green;
}
</style>
</head>
<body>
<form action="" method="post" >
<input type='submit' name='old_account' value='使用<?php echo $_COOKIE['username'];?>账号登录' />
<input type='submit' name='new_account' value='使用新账号登录' />
</form>
</body>
</html>
- login_new.php 新账号登录页面
<?php
if($_POST['sub']){ //用户点击提交 获取用户输入数据
$username = $_POST['username'];
$password = $_POST['password'];
$checked = $_POST['chk'];
if($username == 'root' && $password == 123){ //用户名与密码都正确
if(!empty($checked)){ //勾选了7天免登录
setcookie('username', $username, time()+604800);
}else{ //拒绝7天免登录
setcookie('username', $username);
}
setcookie('isCheck', $checked);
setcookie('isLogin', 1);
header('Location:index.php');
}else{ //用户名或密码错误
echo "<script>alert('用户名或密码错误!');</script>";
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>用户登录</title>
<style>
*{
padding: 0;
margin: 0;
box-sizing: border-box;
}
.login{
margin: 60px auto;
max-width: 400px;
height: 250px;
border: 5px solid green;
display: flex;
flex-flow: column nowrap;
}
.login > h1{
font-size: 20px;
margin: 10px;
text-align: center;
}
.login > form{
display: flex;
flex-flow: column nowrap;
align-items: center;
}
.login > form > *{
width: 280px;
height: 40px;
margin: 10px;
}
.login > form > div{
display: flex;
justify-content: space-between;
}
.login > form > div > input{
width: 100px;
background-color: white;
border: 1px solid green;
}
.login > form > div > div{
font-size: 12px;
line-height: 40px;
}
</style>
</head>
<body>
<div class="login">
<h1>用户登录</h1>
<form action="" method="post">
<input type="text" name='username' placeholder="用户名" require>
<input type="password" name='password' placeholder="密码" require>
<div>
<div><input type="checkbox" name='chk' checked>7天自动登录</div>
<input type="submit" name='sub' value='提交'>
</div>
</form>
</div>
</body>
</html>
- index.php 登录后的页面
<?php
//当用户未通过登录界面进入此页面时 返回登录界面并弹出警告
if(!(isset($_COOKIE['isLogin']) && $_COOKIE['isLogin'] == 1)){
exit('
<script>
alert("重新登录");
location.href="login.php";
</script>
');
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>首页</title>
<style>
body{
display: flex;
flex-flow: column nowrap;
text-align: center;
}
h1{
margin: 0 auto;
}
</style>
</head>
<body>
<h1>首页</h1>
<p><?php echo '欢迎您:',$_COOKIE['username']; ?></p>
<a href="login.php?action=quit">退出登录</a>
</body>
</html>
- 登录主界面演示
- 选择7天自动登录后的界面
- 不选择7天自动登录后的界面
选择7天自动登录后关闭浏览器 再次进入登录的界面
没有使用cookie保存密码
- 直接判断cookie中是否存在正确的用户名进行登录
- 当不选择7天自动登录时 退出登录 删除所有相关的cookie