博客列表 >会话控制实战之登录与验证(cookie与session的使用方式)--2019年6月10日

会话控制实战之登录与验证(cookie与session的使用方式)--2019年6月10日

ChenPJ的博客
ChenPJ的博客原创
2019年06月18日 01:28:02801浏览

完成用户的登录与验证,分别用cookie和session来实现

实战案例包含4个部分,验证流程如下:

1、登录页面,获取用户输入,并用POST方式将数据提交,跳转至验证页面

2、验证页面,接收POST方式传来的登录数据,并与数据库的数据进行比对,如果有则登录成功。登录成功后将用户数据写入COOKIE,并跳转至后台管理页面

3、后台管理页面,提供一个退出按钮,跳转至登出页面

4、删除cookie数据后,跳转至登录页,重新开始。

代码如下:

1、登录页面--login.php

<?php
// 验证是否已经登录
if (isset($_COOKIE['username'])) {
    echo "<script>alert( '请不要重复登录' ) ; location.assign('admin.php');</script>";    
    exit();
}
?>
<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>登录</title>
    </head>
    <body>
        <h3>用户登录</h3>
        <form action="check.php" method="post" onsubmit="return isEmpty()">
            <p>
                <label for="usrAccount">邮箱:</label>
                <input type="email" name="email" id="usrAccount">
            </p>
            <p>
                <label for="loginCode">密码:</label>
                <input type="password" name="password" id="loginCode">
            </p>
            <p>
                <button>提交</button>
            </p>   
        </form>
  
        <script>
            function isEmpty() {
                var usrAccount = document.getElementById("usrAccount").value;
                var loginCode = document.getElementById("loginCode").value;
                if (usrAccount.length===0 && loginCode.length===0) {
                    alert("用户名与密码不能为空");
                    return false;
                }
            } 
        </script> 
    </body>
</html>

2、验证页面--check.php

<?php
if (isset($_COOKIE['username'])) {
    echo "<script>alert( '请不要重复登录' ) ; location.assign('admin.php');</script>";
    exit();
}
require __DIR__ . '/inc/connect.php';
$usrAccount = $_POST["email"];
$loginCode = sha1($_POST["password"]);
$sql = "SELECT * FROM `user` WHERE `email`= :email AND `password`= :password LIMIT 1";
$stmt = $pdo->prepare($sql);
$stmt->execute(["email"=>$usrAccount,"password"=>$loginCode]);
$userDat = $stmt->fetch(PDO::FETCH_ASSOC);
if (false === $userDat) {
    echo "<script>alert('登录失败,请重新登录'); location.assign('login.php');</script>";
    exit();
}
setcookie("username", $userDat["username"]);
echo "<script>alert('登录成功'); location.assign('admin.php');</script>";
?>

3、后台管理页面--admin.php

<?php if (isset($_COOKIE["username"])):?>
<!doctype html>
<html>
    <head>
        <meta charset="zh-cn">
        <title>管理页</title>  
    </head>
    <body>
        <h2>后台管理</h2>
        <p>欢迎:<?php echo $_COOKIE["username"]; ?></p> 
        <p>
            <a href="logout.php">退出</a>
        </p>
    </body>
</html>
<?php else:?>
<script>alert("请登录");location.assign("login.php");</script>
<?php endif; ?>

4、登出页面--logout.php

<?php 
if (isset($_COOKIE["username"])) {
    setcookie("username",null,time()-3600);
    echo "<script>alert('退出成功'); location.assign('login.php');</script>";
} else {
    echo "<script>alert('请登录'); location.assign('login.php');</script>";
}
?>

四个页面中,在头部都写了验证登录状态的代码,避免用户跳过正常流程直接访问。如果已登录,则不能再访问登录页面与验证页面;如果未登录,则不能直接访问后台管理页与登出页面。

判断条件为:

if (isset($_COOKIE["username"]))

如果COOKIE文件存在,则代表已登录,否则是未登录状态。

如果将COOKIE方式改为SESSION方式只需做以下改动:

1. 在每个页面的开始处写上 session_start(); 代表SESSION会话开始。

2. 将超全局变量$_COOKIE改为$_SESSION

3. 验证成功后,将用户信息写入SESSION文件

    用  $_SESSION['username'] = $user['username'];

    替换 setcookie('username', $user['username']);

4. 退出时删除用户信息

    session_destroy()

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议