会话控制-cookie-session

Cookie简介

Cookie是存储在用户计算机上的小文件,它可以用于存储一些会话数据和用户信息,以便在用户下次访问时能够识别和记住用户信息。

// 实现的功能
// 在用户计算机上存储用户信息,如用户名、密码等,实现自动登录等功能。
// 在用户计算机上存储用户个性化设置,如网站皮肤、语言等。
// 记录用户浏览历史,为用户提供更加个性化的服务。
// 跟踪用户访问行为,统计网站访问量、用户访问来源等信息。


<?php
header('Content-type:text/html;charset=utf-8');
// cookie名
$cookiename = 'names';
// cookie值
$value = 'css';
// 过期时间(时间戳)
$time = time() + 3600;
// 设置cookie
setcookie($cookiename, $value, $time);
echo "<br>";
var_dump(setcookie($cookiename, $value, $time));

// 读取cookie
// 这是个超全局变量
if (isset($_COOKIE)) {
echo "<br>";
echo 'cookie存在!';
}
echo "<br>";
var_dump($_COOKIE);
echo "<br>";
var_dump($_COOKIE['names']);

页面的输出结果如下:

/* 
bool(true)
cookie存在!
array(2) {
'names' => string(3) "css"
'trc_cookie_storage' => string(75) "taboola%20global%3Auser-id=60b5758a-da4d-4f23-be4e-918e10a3c8f3-tucta1deb02"
}
string(3) "css"

*/

/*
setcookie的其他参数
$path:可访问 Cookie 的目录,默认为当前目录。(带上这个可以哇完整的销毁会话)
$domain:可访问 Cookie 的域名,默认为当前域名。
$secure:是否只通过 HTTPS 连接传输 Cookie,默认为 FALSE。
$httponly:是否只能通过 HTTP 协议访问 Cookie,默认为 FALSE

*/

unqid


// uniqid
// 为当前机器产生随机ID,多台服务器下可能ID会不唯一,所以需要一些外置条件进行限制。
// uniqid($prefix,$more_entropy)
// $prefix :前缀,可添加
// $more_entropy:如果设置为true,则随机性会增强,唯一性也会增强。为false时,基于当前时间戳取随机值。
var_dump(uniqid(rand(100, 90000)));
// 可以使用这个设置cookie

Session

<?php
// session:身份令牌,用cookie来存储。cookie放到客户端,实现正常的浏览而不是每次切换页面甚至刷新都要登录。

/*
session_start():启动会话,或者如果会话已经启动,则恢复先前的会话。
session_destroy():销毁会话中的所有数据,并释放会话占用的所有资源。
session_id():获取当前会话ID。
session_name():获取或设置当前会话的名称。
session_regenerate_id():生成一个新的会话ID,并复制当前会话中的所有数据到新的会话中。
$_SESSION变量:可以像普通的PHP变量一样使用,用于存储和检索与当前会话相关联的数据。
*/
// 客户端获取session id并且存储(相当于卡号),服务端存储所有的关于session id的数据(相当于银行)。

// 开启session
session_start();

// $_SESSION存储数据
$_SESSION['name'] = 'SYW_SEC';
$_SESSION['email'] = '12345678@qq.com';
$_SESSION['url'] = 'linxiao-wangchuang.github.io';

// 销毁
<?php
// 销毁变量
// 打开要销毁的会话
session_start();
// 销毁1
// 销毁会话,但文件仍在
session_unset();
// 销毁1
// 在服务端把你的session文件销毁掉。
session_destroy();
// 销毁3
// 销毁保存在客户端的卡号
setcookie('names', '', time() - 2600);
// 想要完整销毁,得在后面加上它对应的路径
setcookie('names', '', time() - 2600, '/');
// 共享session的前提:同一个服务器同一个进程

Session数据会存入到对应的tmp目录当中(默认的)。可以在php.ini里面修改位置,找到session.save_path即可。
path

小项目:登录-cookie

各个页面:

login的php文件

<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录页面</title>
<style>
* {
margin: 0;
padding: 0;
}

form {
width: 300px;
height: 200px;
margin: 100px auto;
}

#submit {
width: 100px;
height: 30px;
margin: 10px 80px;
}

p {
width: 100%;
height: 2em;
text-align: center;
}
</style>
</head>

<body style="background-color: orange">
<?php
if (isset($_COOKIE['username']) && $_COOKIE['username'] === 'admin') {
exit("您已经登录了,请不要重复登录!");
}
?>
<form action="login.php" method="post">
<p>姓名:<input type="text" name="username" value=""></p>
<p>密码:<input type="password" name="password" value=""></p>
<p><input type="submit" name="submit" value="登录" id="submit"></p>
</form>
<?php
header('Content-type:text/html;charset=utf-8');
if (isset($_POST['submit'])) {
if (isset($_POST['username']) && isset($_POST['password']) && $_POST['username'] != "" && $_POST['password'] != "") {
if ($_POST['username'] === 'admin' && $_POST['password'] === 'password') {
// $_COOKIE['username']=$_POST['username'];
// $_COOKIE['password']=$_POST['password'];
$boolname = setcookie('username', $_POST['username'], time() + 3600);
setcookie('password', $_POST['password'], time() + 3600);
if ($boolname == true) {
// echo "<script>alert('用户" . $_POST['username'] . "登录成功!')</script>";
header('Location:index.php');
} else {
// echo 'cookie设置失败!';
header('Location:skip.php?url=index.php&info=cookie设置失败!');
}
} else {
// echo '<script>alert("用户名或密码输入错误!")</script>';
header('Location:skip.php?url=login.php&info=用户名或密码输入错误!');
}
} else {
echo "<script>alert('用户名或者密码未输入!')</script>";
}
}
?>
</body>

</html>

login

index的php文件

<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>欢迎</title>
<style>
body {
background-color: orange;
}

h1 {
width: 500px;
font-size: 50px;
font-weight: 700;
margin: 200px auto;
}
</style>
</head>

<body>
<?php
header('Content-type:text/html;charset=utf-8');
if (isset($_COOKIE['username']) && $_COOKIE['username'] === 'admin') {
echo "亲爱的{$_COOKIE['username']}您好!";
echo '<a href="logout.php">注销登录状态</a>';
} else {
echo '您的登录状态丢失!点击<a href="login.php">此处进行登录</a>';
}
?>
<h1>欢迎来到骇客论坛!</h1>

</body>

</html>

login

skip中转站

<?php
if (!isset($_GET['url']) || !isset($_GET['url'])) {
exit();
}
?>
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="refresh" content="3;URL=<?php echo $_GET['url'] ?>" />
<title>正在跳转……</title>
<style>
body {
background-color: red;
color: aliceblue;
font-size: 35px;
font-weight: 800;
}
</style>

</head>

<body>
<div>
<?php
echo $_GET['info'];
echo '3s后完成跳转……';
?>
</div>
</body>

</html>

销毁

<?php
header('Content-type:text/html;charset=utf-8');
if (isset($_COOKIE['username']) && $_COOKIE['username'] === 'admin') {
if (setcookie('username', $_POST['username'], time() - 3600)) {
header("Location:skip.php?url=index.php&info=注销成功!正在跳转到主页面!");
// session_start();
// =array();
} else {
header("Location:skip.php?url=index.php&info=注销失败!没有这个用户!正在跳转到主页面!");
}
} else {
echo '您的登录状态丢失!点击<a href="login.php">此处进行登录</a>';
}

上面的例子可以更改为Session的,具体暂不阐述,看下面代码吧。

小项目-登录-session

login的php文件

<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录页面</title>
<style>
* {
margin: 0;
padding: 0;
}

form {
width: 300px;
height: 200px;
margin: 100px auto;
}

#submit {
width: 100px;
height: 30px;
margin: 10px 80px;
}

p {
width: 100%;
height: 2em;
text-align: center;
}
</style>
</head>

<body style="background-color: orange">
<?php
session_start();

if (isset($_SESSION['username']) && $_SESSION['username'] === 'admin') {
exit("您已经登录了,请不要重复登录!");
}
?>
<form action="login.php" method="post">
<p>姓名:<input type="text" name="username" value=""></p>
<p>密码:<input type="password" name="password" value=""></p>
<p><input type="submit" name="submit" value="登录" id="submit"></p>
</form>
<?php
header('Content-type:text/html;charset=utf-8');
if (isset($_POST['submit'])) {
if (isset($_POST['username']) && isset($_POST['password']) && $_POST['username'] != "" && $_POST['password'] != "") {
if ($_POST['username'] === 'admin' && $_POST['password'] === 'password') {
$_SESSION['username'] = $_POST['username'];
$_SESSION['password'] = $_POST['password'];
header('Location:index.php');
} else {
header('Location:skip.php?url=login.php&info=用户名或密码输入错误!');
}
} else {
echo "<script>alert('用户名或者密码未输入!')</script>";
}
}
?>
</body>

</html>

index的php文件

<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>欢迎</title>
<style>
body {
background-color: orange;
}

h1 {
width: 500px;
font-size: 50px;
font-weight: 700;
margin: 200px auto;
}
</style>
</head>

<body>
<?php
header('Content-type:text/html;charset=utf-8');
session_start();
if (isset($_SESSION['username']) && $_SESSION['username'] === 'admin') {
echo "亲爱的{$_SESSION['username']}您好!";
echo '<a href="logout.php">注销登录状态</a>';
} else {
echo '您的登录状态丢失!点击<a href="login.php">此处进行登录</a>';
}
?>
<h1>欢迎来到骇客论坛!</h1>

</body>

</html>

logout.php

<?php
session_start();
header('Content-type:text/html;charset=utf-8');
if (isset($_SESSION['username']) && $_SESSION['username'] === 'admin') {
session_unset();
session_destroy();
setcookie(session_name(), '', time() - 3600, '/');
header("Location:skip.php?url=index.php&info=注销成功!正在跳转到主页面!");
} else {
header("Location:skip.php?url=index.php&info=注销失败!请稍后重试!");
}

skip的直接抄上面的skip.php即可。当然,既然时项目,那么所有的php都会放在同一个文件夹下。