博主信息
曾
博文
22
粉丝
0
评论
1
访问量
1095
积分:0
P豆:44

用户的登录与验证(COOKIE)

2020年02月09日 00:01:05阅读数:195博客 / / 学习流程

会话控制

http 是基于无连接的网络协议, 每一次访问, 对于服务器来说, 都是全新的
就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的,这种无状态的的好处是快速,但是因为每次连接都是全新的,为了让用户体验更好,为了某个域名下的所有网页都能共享某些数据信息,就要用到cookie或者session

cookie与session的区别

cookie
1.它是保存在客户端,变量名为$_COOKIE,
2.设置它的专用函数为setcookie(键名,键值,time()设置过期时间)
3.它生效分为两步:第一步由PHP发出命令到浏览器,第二步由浏览器完成COOKIE的写入
session
1.它是保存在服务器端
2.变量:$_SESSION
3.使用的时候必须先开启会话,命令为session_start()
4.删除命令:session_destory()

会话实例(cookie)

首先新建一个登录表单
HTML代码

<!-- 这行PHP代码是判断COOKIE是否已经写入,如果已经写入说明已经登录,就不再允许重复登录 --><?phpif(filter_has_var(INPUT_COOKIE,'user')){    exit('<script>alert("请不要重复登录");location.href="index.php"</script>');    // exit('<script>alert("请不要重复登录");location.href="index.php"</script>');}?>    <div>     <!-- 跳转地址需要给一个get值,方便判断跳转链接的合法性 -->        <form action="handle.php?action=login" method="POST">            <span>用户登录</span>            <span>                <label for="username">用户名:</label>                <input type="text" name="username" id="username" require>            </span>            <span>                <label for="password">密&nbsp;&nbsp;&nbsp;码:</label>                <input type="password" name="password" id="password" require>            </span>            <button>提交</button>        </form>        <a href="register.php">没有账号,注册一个</a>    </div>

图:大概是这样的

然后建一个服务器数据文件
例:感觉比较关键,我就全写上来了

<?php//获取到跳转链接的action值$action = filter_input(INPUT_GET, 'action', FILTER_SANITIZE_STRING);//设置允许访问的链接(文件)$url = filter_input(INPUT_SERVER, 'HTTP_REFERER');//获取文件路径到目录位置$retname = dirname(filter_input(INPUT_SERVER, 'HTTP_REFERER'));//设置一个数组,使用获取到的文件目录拼接上允许访问的文件名$URLS = [$retname . '/login.php', $retname . '/register.php', $retname . '/index.php'];//因为没学习数据库,设置一个用户数据,来进行验证$users = [    [        'id' => 1,        'name' => 'admin',        'password' => '7c4a8d09ca3762af61e59520943dc26494f8941b',        'email' => 'admin@qq.com'    ],    [        'id' => 2,        'name' => 'test',        'password' => '7c4a8d09ca3762af61e59520943dc26494f8941b',        'email' => 'test@qq.com'    ]];//判断访问链接是否合法if (in_array($url, $URLS)) {    //链接如果合法则用$_GET获取到的action值,来判断跳转过来的是什么页面    switch ($action) {            // 如果action=login为登录页面跳转        case 'login':            //先验证链接的合法性            if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') === 'POST') {                //获取用户名与密码                $username = filter_var(filter_input(INPUT_POST, 'username'), FILTER_SANITIZE_STRING);                //密码要嵌套加密                $password = sha1(filter_input(INPUT_POST, 'password'));                //测试拿到数据没                // echo $username,$password;                // array_filter(数组,(function(循环数值接收变量){输出语句}))                //使用array_filter来测试用户登录的用户名与密码是否存在于服务器当中                $result = array_filter($users, function ($value) use ($username, $password) {                    return $username === $value['name']  &&  $password === $value['password'];                });                // 测试数据有没有拿到                // echo '<pre>'.print_r($result,true).'</pre>';                //因为每个用户相对应的信息只有一条,所以使用count来查询获取到的数组长度,如果为一,则正确                if (count($result) === 1) {                    // 设置COOIKE,键名为USER,因为获取到的数据为数组,使用serialize,把数据序列化                    setcookie('user', serialize(array_pop($result)));                    // 测试打印COOKIE是否拿到                    // echo $_COOKIE['user'];                    echo '<span>登录成功</span><br><a href="index.php">点击跳转到首页</a>';                } else {                    echo '<a href="login.php">用户名或者密码错误重新输入</a><br><a href="register.php">没有账号请注册</a>';                }            } else {                exit('非法请求');            }            break;            //action=logout,为退出页面请求        case 'logout':            // 先检测是否在登录状态(就是查看有没有cookie)            if (filter_has_var(INPUT_COOKIE, 'user')) {                // 如果有删除cookie,time()只要是负数就可以删除,正数为保存时间                setcookie('user', null, time() - 3600);                exit('<script>alert("已退出登录");location.href="index.php"</script>');            } else {                exit('<script>alert("不在登录状态");location.href="index.php"</script>');            }            break;            //如果action=register为注册页面        case 'register':            //判断表单发送方式是否为POST            if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') === 'POST') {                //获取表单发送的username                $name = filter_input(INPUT_POST, 'username');                //获取表单发送的password                $password = sha1(filter_input(INPUT_POST, 'password1'));                //获取表单发送的email                $email = filter_var(filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL), FILTER_SANITIZE_EMAIL);                // echo $email;                $id = 3;                //把获取到的数据压缩为一个数组                $date = compact('id', 'name', 'password', 'email');                // array_push($users,$date);                // echo '<pre>'.print_r($users,true).'</pre>';                // echo count($users);                //把数组放进预先设置好的用户数据里面,然后判断是否只获取到一条用户数据(用户数据一次只允许获得一条)                if(count(array_push($users,$date))===1){                    echo('<script>alert("注册成功请登录");location.href="login.php"</script>');                }else{                    exit('<script>alert("数据错误重新输入");location.href="register.php"</script>');                }            }    }}

开始验证
图1输入预先在PHP文件设置好的用户名与密码

图2验证通过

图3用户密码错误

图4判断是否重复登录

登录验证完毕,然后验证COOKIE是否写入
用HMTL建一个首页

<?php// 判断是否已经登录,如果登录了,就把COOKIE的值拿到,然后把登录更改为退出if(filter_has_var(INPUT_COOKIE,'user')){    $user = unserialize(filter_input(INPUT_COOKIE,'user'));?>    <div class="header">        <a href="">我的测试页面</a>        <!-- 判断是否登录,isset()函数,如果'变量'存在并且值不是'NULL'则返回 TRUE,否则返回 FALSE。 -->        <?php if(isset($user)):?>            <!-- 如果值存在则输出用户名,与退出 -->            <a href="handle.php?action=logout"><span><?=$user['name']?></span>退出</a>        <?php else:?>            <a href="login.php">登录</a>        <a href="register.php">注册</a>        <?php endif;?>    </div>

图:未登录状态大概是这样的

图2:登录通过,并检测到有写入COOKIE

使用session修改

要使用session一定要记住,在每个页面开始都要写上session_start()来开启会话
首页的修改

<?php//使用session要先开始对话session_start();//这里判断是否登录直接就用isset()函数,来查看session里面是否包含有user键if(isset($_SESSION['user'])){    //如果有直接拿到数据就行    $user = $_SESSION['user'];}// if(filter_has_var(INPUT_COOKIE,'user')){//     $user = unserialize(filter_input(INPUT_COOKIE,'user'));//     // 打印调试获取到的COOKIE是不是正确//     // print_r($user);// }?><body>    <div class="header">        <a href="">我的测试页面</a>        <!-- 上面判断了数据并赋值给$user,这里判断是否有$user -->        <?php if(isset($user)):?>            <!-- 如果有判断为登录状态,把登录改为退出即可,使用$user['name']输出用户名,表示是谁登录的 -->            <a href="handle.php?action=logout"><span><?=$user['name']?></span>退出</a>        <?php else:?>            <a href="login.php">登录</a>        <a href="register.php">注册</a>        <?php endif;?>    </div></body></html>

最终所达到的效果是一样的
图1

图2

session的使用相对简单一点,不需要使用过滤器来获取数据,直接使用变量调用就行
附上笔记= = 比较潦草,就是怕忘记了

今天练习了过后,咦,,发现我也会了,感觉离目标越来越近了。数据验证的大体思路会了,在以后要写的时候,一开始就把思路离清楚,需要去验证些什么,大概要怎么验证。思路有了,其他的还远嘛!加油!

批改状态:未批改

老师批语:

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
曾
  • · 2020-02-14 17:08:272楼
  • 哈哈哈,我自己都看习惯了,也不管它难不难看了

  • 回复
  • 大海
  • 大海· 2020-02-11 16:39:501楼
  • 我为你敢“亮字”的勇气点赞

  • 回复
  • 页面底部区域 foot.htm