1.5 用户登录

1.5.1 用户登录功能概述

用户登录功能就是对用户输入的账号、密码及验证码进行验证。验证包括信息是否为空、验证码是否错误、用户计算机是否已经被锁定、用户是否存在、用户是否激活、用户名和密码是否匹配、用户登录次数是否达到上限等。登录功能的运行结果如图1.12所示。

图1.12 单击“登录”按钮后的运行结果

登录功能有3个核心文件,分别是login.php(用户登录页)、login.js(登录信息验证脚本)和login_chk.php(登录处理页)。

1.5.2 登录页面设计

1.登录页中的元素名称和属性

相对于注册页面来说,登录页(login.php)中的表单元素要少很多,也没有那么复杂。登录页元素名称和属性值如表1.2所示。

表1.2 登录页中的元素名称和属性

2.登录信息验证脚本(login.js)

在登录页login.php中,载入了login.js脚本文件,通过该脚本文件完成对登录用户的所有验证操作,其代码如下:

      function $(id){
            return document.getElementById(id);
      }
      window.onload = function(){
            …
      }

接下来的函数功能是焦点自动下移。当焦点移动到最后一个文本框即验证码输入框后,再次按下<Enter>键,将调用chklg()函数对用户输入的信息进行验证,代码如下:

            $(' lgname' ).focus();                      //光标定位到用户名输入框
            $(' lgname' ).onkeydown = function(){       //处理用户名输入库的键盘按下事件
                if(event.keyCode == 13){                //当按下<Enter>键时,光标自动下移
                    $(' lgpwd' ).select();              //密码框获取焦点
                }
            }
            $(' lgpwd' ).onkeydown = function(){
                if(event.keyCode == 13){                //处理密码框的鼠标按下事件
                    $(' lgchk' ).select();              //验证码文本框获得焦点
                }
            }
            $(' lgchk' ).onkeydown = function(){        //处理验证码输入框的鼠标按下事件
                if(event.keyCode == 13){
                    chklg();                            //调用chklg()函数
                }
            }
            $(' lgbtn' ).onclick = chklg;

接下来的代码是进行最基本的检测,包括用户名要合法、信息不能为空、验证码输入错误等,代码如下:

      function chklg(){
              /*判断用户名是否合法,用户名第一位必须是英文字母,不允许有特殊字符*/
              if($(' lgname' ).value.match(/^[a-zA-Z_]\w*$/) == null){
                  alert(’请输入合法名称’);
                  $(' lgname' ).select();
                  return false;
              }
              /*用户名是否为空*/
              if($(' lgname' ).value == ' ' ){
                  alert(’请输入用户名!' );
                  $(' lgname' ).focus();
                  return false;
              }
              /*密码是否为空*/
              if($(' lgpwd' ).value == ' ' ){
                  alert(’请输入密码!' );
                  $(' lgpwd' ).focus();
                  return false;
              }
              /*验证码是否为空*/
              if($(' lgchk' ).value == ' ' ){
                  alert(’请输入验证码’);
                  $(' lgchk' ).select();
                  return false;
              }
              /*验证码输入是否正确*/
              if($(' lgchk' ).value ! = $(' chknm' ).value){
                  alert(’验证码输入错误’);
                  $(' lgchk' ).select();
                  return false;
              }

接下来,判断客户端的Cookie值是否大于3,如果大于3,说明用户是非法操作的,将停止继续执行,代码如下:

              count = document.cookie.split(' ; ' )[0];             //获取Cookie信息
              if(count.split(' =' )[1] >= 3){
                  alert(’因为您的非法操作,您将无法再执行登录操作’);
                  return false;
              }

最后,将用户输入的信息传递给login_chk .php页进行处理,代码如下:

              url = ' login_chk.php? act=' +(Math.random())+' &name=' +$(' lgname' ).
              value+' &pwd=' +$(' lgpwd' ).value;
              xmlhttp.open(' get' , url, true);
              xmlhttp.onreadystatechange = function(){
                  if(xmlhttp.readystate == 4){
                      if(xmlhttp.status == 200){
                            //获取login_chk.php页的返回值
                            msg = xmlhttp.responseText;
                            if(msg == '0' ){
                              alert(’您还没有激活,请先登录邮箱进行激活操作。' );
                            }else if(msg == '1' ){
                              alert(’用户名或密码输入错误,您还有2次机会’);
                              $(' lgpwd' ).select();
                            }else if(msg == '2' ){
                              alert(’用户名或密码输入错误,您还有1次机会’);
                              $(' lgpwd' ).select();
                            } else if(msg == '4' ){
                              alert(’用户名输入错误’);
                              $(' lgname' ).select();
                            } else if(msg == ' -1' ){
                              alert(’登录成功’);
                              location = ' main.php' ;
                            }else{
                              alert(msg);
                            }
                      }
                  }
              }
              xmlhttp.send(null);
            }

1.5.3 登录处理页

在登录处理页(login_chk.php)中,对表单中提交的用户名、密码进行验证,包括用户名是否存在、用户名是否被激活、用户登录次数、密码是否正确等,最终返回验证结果,其代码如下:

      <? php
            session_start();                                     //开启Session支持
            header(' Content-Type:text/html; charset=gb2312' ); //设置头信息
            include_once ' conn/conn.php' ;                      //载入数据库类
            $name = $_GET[' name' ];
            $pwd = $_GET[' pwd' ];                               //获取名称和密码
            if(! empty($name) and ! empty($pwd)){
              //得到当前数据表中的count字段和active字段
              $sql = "select name, count, active from tb_member where name =
              '".$name."' ";
              $active = $conne->getFields($sql,2);
              $count = $conne->getFields($sql,1);
              $conne->close_rst();
              //判断用户是否存在
              if($active == ' ' ){
                  if(is_null($_COOKIE[' count' ]) or $_COOKIE[' count' ] == 0){
                      setcookie(' count' ,1);
                  }else{
                      setcookie(' count' , $_COOKIE[' count' ]+1);
                  }
                  $reback = 4;
              }else if($active == 0){                      //判断用户是否被激活
                  $reback = '0' ;
              }else if($count >= 3){
                  $reback = '3' ;                          //判断用户的登录次数
              }else{
                  $sql .= " and password = ' ".md5($pwd)."' ";
                  $num = $conne->getRowsNum($sql);
                  if($num == 0 or $num == ' ' ){           //如果用户密码错误,登录次数加1
                      $num = $conne->uidRst("update tb_member set count = ".
                      ($count+1)." where name = ' ".$name."' ");
                      $reback = ($count+1);
                  }else{                                   //登录成功,清空count字段值
                      if($count ! = 0){
                          $num = $conne->uidRst("update tb_member set count = 0 where
                          name = ' ".$name."' ");
                      }
                      //设置cookie
                      if(isset($_COOKIE[' count' ]) and $_COOKIE[' count' ] ! = 0){
                          setcookie(' count' ,0);
                      }
                      $_SESSION[' name' ] = $name;
                      $reback = ' -1' ;
                  }
              }
            }
            echo $reback;
      ?>

1.5.4 生成及刷新验证码

验证码生成应用的是GD2函数库中的函数,操作存储于valcode.php文件中,其完整代码可以参考本章1.2.3节,这里不再赘述。

当页面第一次被载入时,将执行login.js中的showval()函数来生成验证码,并且调用valcode.php文件以图像形式输出验证码。因为验证码中带有干扰串,如果用户看不清,可以单击首页中“看不清”超链接来再次执行shwoval()函数,即刷新验证码。login.js脚本中showval()函数的代码如下:

      showval();                                       //调用showval()函数生成图文验证码
      $(' changea' ).onclick = showval;                //更换验证码
            //验证码生成函数
            function showval(){
              num = ' ' ;
              for(i=0; i<4; i++){
                    …                                 //生成随机数,见第1.2.3节
              }
              $(' chkid' ).src=' valcode.php? num=' +num; //显示图片验证码
              $(' chknm' ).value = num;                //将验证码保存到chknm隐藏域
            }