1.设计并实现“用户登录”页面,要求:
(1)当用户登录失败时,给出相应提示。
(2)当用户登录成功后,把用户姓名保存在SESSION中,并跳转至“用户中心”页面,在“用户中心”页面显示欢迎该用户的欢迎语(“用户中心”页面不能在未登录状态直接访问)。
(3)在“用户中心”页面设置“退出”链接,当用户单击“退出”链接时,清除SESSION中存储的用户信息。
拓展题:
(1)在上述要求基础上,实现7天免登录功能。
sql文件:
CREATE TABLE `userinfo` (
`userID` varchar(15) NOT NULL COMMENT '账号',
`userName` varchar(30) DEFAULT '' COMMENT '真实姓名',
`userPwd` varchar(32) DEFAULT NULL COMMENT '密码',
`salt` varchar(4) DEFAULT NULL COMMENT '盐',
`regDate` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
PRIMARY KEY (`userID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
select userPwd,userName,salt from userInfo where userName = "张三";
insert into userinfo value("1003","二狗","123","0812","2020-01-04 15:21:46");
<?php
//登录界面
//创建一个session会话
session_start();
$link = mysqli_connect('localhost','root','zwq123','zuoye');
//如果 已经登录的话 则直接跳转到用户界面 (免登录)
if(isset($_SESSION['userName'])){
header("Location:admin.php");
exit();
}
//获取登录界面的 用户名与密码
if($_POST){
$Name = $_POST["userName"];
$pwd = $_POST["userPwd"];
$sql = "select userPwd,userName,salt from userInfo where userName = '$Name'";
$res = mysqli_query($link,$sql);
$row = mysqli_fetch_assoc($res);
//不需要用循环遍历,因为每一个人都是独一无二的,所以用sql获取后直接if判断
if($row["userName"] == $Name){
//把 name值放到 session中
$_SESSION['userName'] = $Name;
//如果勾选七天免登录的话 设置cookie,用于保存获取的name
if(isset($_POST['remember'])){
setcookie('userName',$Name,time()+60*60*24*7);
}
//这一段代码用于判断当前用户是否已经登录,如果没有登录(session中没有name值)
//但在cookie中存储了name,则将name存储到session中,实现自动登录
if(!isset($_SESSION['userName']) && isset($_COOKIE['userName'])){
$_SESSION['userName'] = $_COOKIE['userName'];
}
//登录成功,跳转到用户界面
header('Location:admin.php');
exit();
}else{
echo "未查询到该用户";
}
}
mysqli_stmt_close($stmt);
mysqli_close($link);
?>
<!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>
</head>
<body>
<h2>用户登录</h2>
<form action="setSession.php" method="post">
用户名:<input type="text" placeholder="请输入用户名" name="userName" required id="userName">
密 码:<input type="password" placeholder="请输入密码" name="userPwd" required id="userPwd">
<label><input type="checkbox" name="remember">7天免登录</label><br>
<button type="submit" name="submit">登 录</button>
</form>
</body>
</html>
<?php
//用户界面
session_start();
//如果session中 存在该name值 则表示登录成功,登录失败则跳转到登录界面
if(isset($_SESSION['userName'])){
$name = $_SESSION['userName'];
echo "登录成功,".$name;
}else{
die("<script>alert('登录失效');location.href='setSession.php</script>'");
}
echo '<br><a href="logout.php">退出登录</a>'
?>
<?php
//登出后跳转到登录页面
session_start();
//登出,则删除session中的name值,且销毁session
unset($_SESSION['userName']);
session_destroy();
setcookie('userName','',time()-3600);
header('Location:setSession.php');
exit();
?>
如果不点击退出登录,直接进入登录页面的话,会免登录进入用户界面
注意
session与cookie实现七天免登录只是PHP课本中的一个简单实现例子,理解原理即可,但太过简单明显不安全
互联网某些网站使用到七天免登录则是从中进行了升级,提高了安全性
一般需要以下几个步骤:
1.用户登录时,服务端验证用户身份后生成一个加密的 token(该 token 可以是随机字符串或者是使用 JWT 等技术生成的 JSON Web Token),将该 token 存储在服务端的数据库或者缓存中,并将该 token 发送给客户端。
2.客户端接收到 token 后,将其存储在本地浏览器的 cookie 中,并设置该 cookie 的过期时间为七天后。
3.用户再次访问网站时,浏览器会将之前存储的 cookie 发送给服务端。服务端接收到 cookie 后,会对其进行解密并验证其合法性。如果验证通过,则自动登录。
4.服务端需要定期检查用户的登录状态,比如每次用户访问网站时都会检查其登录状态是否已过期。如果已过期,则需要重新验证用户的身份并生成新的 token。
需要注意的是,在实现“七天免登录”的过程中,需要注意安全性问题,例如加密算法的选择、token 的有效期限制等,以确保用户信息的安全。