PHP+jQuery 注册模块的改进(一):验证码存入SESSION

需要修改的几个文件:

①register.php 生成随机数和加密值

把register.html改为register.php,并开启session;

把register.js中生成随机数的函数写在register.php中,并改用php方法

<?php session_start();?>
....
<?php 

  //生成随机数函数
  function showval(){

    $num = "";
    for($i=0;$i<4;$i++){

      $tmp = rand(1,15);
      if ($tmp > 9) {
        switch ($tmp) {
          case(10):
            $num .= 'a';
            break;
          case(11):
            $num .= 'b';
            break;
          case(12):
            $num .= 'c';
            break;
          case(13):
            $num .= 'd';
            break;
          case(14):
            $num .= 'e';
            break;
          case(15):
            $num .= 'f';
            break;
          }
        } else {
          $num .= $tmp;
          }
        }
      return $num;
    }

  //生成随机数
  $mdnum = md5(showval());

  //把随机数和经过加密的随机数都存入session
  $_SESSION['num'] = showval();
  $_SESSION['mdnum'] = $mdnum;
?>
  <!--验证码-->
  <div class="ipt iptend">
    <input type='text' id='yzm' name='yzm' placeholder="验证码" autocomplete="off" />
    <img id='yzmpic' src='valcode.php?num=<?php echo $mdnum;?>' style="cursor:pointer" title="验证码" alt="验证码">
    <a style="cursor:pointer" id='changea'>
      <img id="refpic" src="templets/images/ref.jpg" alt="刷新验证码">
    </a>
    <span id='yzmchk'></span>
  </div>

把生成的4位验证码和经过md5加密的验证码都存入session,而客户端验证码图片的src属性的参数则是那个加密过的值,因此在客户端不会出现四位验证码的文字。

②valcode.php 把随机数写入图形

在register.php中,验证码图片的地址是

<img id='yzmpic' src='valcode.php?num=<?php echo $mdnum;?>' >

因此在valcode.php中,需要做相应修改,修改之处是把原来的:

//直接传送客户端输入的值$num = $_GET['num'];

修改为:

session_start();
header("content-type:image/png");

  //session中保存生成的4位随机数和经过ms5加密的随机数
  if(isset($_SESSION['mdnum']) && $_SESSION['mdnum']!=""){

    $mdnum = $_SESSION['mdnum'];

    if(isset($_GET['num']) && $_GET['num']!=""){

      //当注册页传递过来的num和session中经过加密的随机数相等时
      if($_GET['num'] == $mdnum){

        if(isset($_SESSION['num']) && $_SESSION['num']!="")

          //把session中保存的4位随机数赋给$num
          $num = $_SESSION['num'];
      }
    }
}

即客户端图片传递过来的加密的参数同session中保存的加密过的值相同时,就把session中保存的4位验证码写入图形。

valcode.php的完整代码为:

<?php 

  session_start();
  header("content-type:image/png");

  //session中保存生成的4位随机数和经过ms5加密的随机数
  if(isset($_SESSION['mdnum']) && $_SESSION['mdnum']!=""){

    $mdnum = $_SESSION['mdnum'];

    if(isset($_GET['num']) && $_GET['num']!=""){

      //当注册页传递过来的num和session中经过加密的随机数相等时
      if($_GET['num'] == $mdnum){

        if(isset($_SESSION['num']) && $_SESSION['num']!="")

          //把session中保存的4位随机数赋给$num
          $num = $_SESSION['num'];
      }
    }
  }

  $imagewidth = 150;
  $imageheight = 54;

  //创建图像
  $numimage = imagecreate($imagewidth, $imageheight);

  //为图像分配颜色
  imagecolorallocate($numimage, 240,240,240); 

  //字体大小
  $font_size = 33;

  //字体名称
  $fontname = 'arial.ttf';

  //循环生成图片文字
  for($i = 0;$i<strlen($num);$i++){

    //获取文字左上角x坐标
    $x = mt_rand(20,20) + $imagewidth*$i/5;

    //获取文字左上角y坐标
    $y = mt_rand(40, $imageheight);

    //为文字分配颜色
    $color = imagecolorallocate($numimage, mt_rand(0,150), mt_rand(0,150), mt_rand(0,150));

    //写入文字
    imagettftext($numimage,$font_size,0,$x,$y,$color,$fontname,$num[$i]);
  }

  //生成干扰码
  for($i = 0;$i<2200;$i++){
    $randcolor = imagecolorallocate($numimage, rand(200,255), rand(200,255), rand(200,255));
    imagesetpixel($numimage, rand()%180, rand()%90, $randcolor);
  }

  //输出图片
  imagepng($numimage);
  imagedestroy($numimage);

?>

③register.js进行验证

验证部分改为使用Ajax进行验证,把输入的4位验证码传递给chkyzm.php文件,和session中保存的4位验证码进行对比。

刷新图片时,重新生成4位验证码,并和加密验证码一起写入session。重新生成验证码的代码写在了refresh.php中,并在register.js中使用ajax来请求重新生产的4位验证码和加密验证码,并通过jQuery把加密验证码的值作为图片的src属性的参数,经过参数和session比对后valcode.php会重新生成4位验证码的图片

register.js验证码部分的代码为:

//验证码按钮
$("#refpic").hover(function(){

      $(this).attr("src","templets/images/refhover.jpg");
    },function(){

      $(this).attr("src","templets/images/ref.jpg");
    }).mousedown(function(){

      $(this).attr("src","templets/images/refclick.jpg");
    }).mouseup(function(){

      $(this).attr("src","templets/images/ref.jpg");
    });

    //刷新验证码
    function postyzm(){

      $.post("./../refresh.php",function(data,textStatus){

        $('#yzmpic').attr("src","valcode.php?num="+data);
      })
    }

    $('#yzmpic').click(function(){

      postyzm();
    });

     $('#changea').click(function(){

      postyzm();
    });

    //验证码检验
    function yzmchk(){

      $.post("./../chkyzm.php",{

        //要传递的数据
        yzm : $("#yzm").val()
      },function(data,textStatus){

        if(data == 0){

          success($("#yzmchk"),"");
          yzmval = true;
        }else if(data == 1){

          var noticeMsg = '验证码不能为空';
          notice($("#yzmchk"),noticeMsg);
        }else{

          var errorMsg = '请输入正确的验证码';
          error($("#yzmchk"),errorMsg);
        }
      });

    }

    //验证码的blur事件
    $("#yzm").focus(function(){

      var noticeMsg = '不区分大小写';
      notice($("#yzmchk"),noticeMsg);
    }).click(function(){

      var noticeMsg = '不区分大小写';
      notice($("yzmdchk"),noticeMsg);
    }).keydown(function(){

      if(event.keyCode == 13){        

        //检验
        yzmchk();
      }
    }).keyup(function(){

      if(event.keyCode == 13){        

        //提交
        formsub();
      }
    }).blur(function(){

      yzmchk();
});

chkyzm.php

<?php
session_start();
header("charset=utf-8");

if(isset($_POST['yzm']) && $_POST['yzm']!=""){

  $yzm = $_POST['yzm'];

  if(isset($_SESSION['num']) && $_SESSION['num']!=""){

    //当输入的验证码和session里保存的num一致时
    if(strtolower($yzm) == $_SESSION['num']){

      //输入正确
      $state = 0;
    }else{

      //输入错误
      $state = 2;
    }
  }
}else{  

  //没有输入
  $state = 1;
}
echo $state;
?>

refresh.php

<?php 

session_start();

//生成验证码
function showval(){

  $num = "";
  for($i=0;$i<4;$i++){

    $tmp = rand(1,15);
    if ($tmp > 9) {
      switch ($tmp) {
        case(10):
          $num .= 'a';
          break;
        case(11):
          $num .= 'b';
          break;
        case(12):
          $num .= 'c';
          break;
        case(13):
          $num .= 'd';
          break;
        case(14):
          $num .= 'e';
          break;
        case(15):
          $num .= 'f';
          break;
      }
    } else {
      $num .= $tmp;
    }
  }
  return $num;
}

$_SESSION['num'] = showval();
$_SESSION['mdnum'] = md5(showval());

echo $_SESSION['mdnum'];

显示的效果如图:

总结:

5个步骤:把4位验证码写入session再生成图片,客户端图片的参数使用加密的验证码,把输入的字符同SESSION中的4位验证码进行比对,刷新图片重新生成4位验证码并存入session,把重新生产的加密验证码作为图片的src参数

用图可表示为:

(未完待续)

(0)

相关推荐

  • JQuery实现简单验证码提示解决方案

    先看效果图: 要求:当输入框获得焦点时,自动显示验证图片. 代码如下(学习而已,仅供参考): 复制代码 代码如下: /***********************下是验证码对象*****************/ var Validation = {}; Validation.init = function(eleName,imageSrc){ this.image = imageSrc; $('#'+eleName).focusin(function(){ Validation.show(e

  • jquery实现手机发送验证码的倒计时代码

    复制代码 代码如下: var wait=60;//时间 function time(o,p) {//o为按钮的对象,p为可选,这里是60秒过后,提示文字的改变 if (wait == 0) { o.removeAttr("disabled"); o.val("点击发送验证码");//改变按钮中value的值 p.html("如果您在1分钟内没有收到验证码,请检查您填写的手机号码是否正确或重新发送"); wait = 60; } else { o.

  • jQuery点击输入框显示验证码图片

    先看效果图: 要求:当输入框获得焦点时,自动显示验证图片. 代码如下(学习而已,仅供参考): /***********************下是验证码对象*****************/ var Validation = {}; Validation.init = function(eleName,imageSrc){ this.image = imageSrc; $('#'+eleName).focusin(function(){ Validation.show(eleName); })

  • jQuery插件实现静态HTML验证码校验

    jQuery由美国人John Resig创建,它是一个快速.简洁的JavaScript库,提供了很多遍历函数,如each(fn).jQuery能够使用户的html页保持代码和html内容分离,也就是说,不用再在html里面插入一堆js来调用命令了,只需定义id即可.正是这些操作上的特点,用户可以方便地处理HTML文档.事件.实现动画效果,并且方便地为网站提供交互.如今,jQuery已经吸引了来自世界各地的众多JavaScript高手加入. 这里所要讲到的jQuery Real Person Pl

  • Jquery插件实现点击获取验证码后60秒内禁止重新获取

    通过jquery.cookie.js插件可以快速实现"点击获取验证码后60秒内禁止重新获取(防刷新)"的功能 效果图: 先到官网(http://plugins.jquery.com/cookie/)下载cookie插件,放到相应文件夹,代码如下: 复制代码 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv=&qu

  • jQuery实现一个简单的验证码功能

    在学习jQuery过程中,写的一个简单的验证码的小例子,记载下来,方便以后借鉴补充,源码如下: <!DOCTYPE html> <html> <head> <title></title> <style type="text/css"> div{ background-color:blue; width:200px; height:100px; font-size:35px; } </style> <

  • jquery禁止输入数字以外的字符的示例(纯数字验证码)

    纯数字验证码的时候用到的,整理如下: 复制代码 代码如下: $('#mobile-vcode').unbind();$("#mobile-vcode").bind("keyup change",function () {    $(this).val($(this).val().replace(/\D/g,''));    if($(this).val().length==4){        /*ajax检测验证码是否正确,正确则激活按钮*/    }});

  • PHP+jQuery 注册模块的改进(二):邮箱激活第1/2页

    接<PHP+jQuery 注册模块的改进之一>继续修改: ①在注册成功后返回登录邮件页面( maillogin.php ),在页面中用户可以点击链接跳转到自己注册邮箱的登录页面,可以再次发送激活链接: ②给激活链接设置有效期,过了有效期点击激活连接,会跳转页面让用户选择再次发送邮件或者返回注册页:再次发送邮件后,进邮箱点击链接激活: ③点击重新发送激活连接,不跳转页面,在当前页无刷新弹出通知:已重新发送链接,几秒钟之后通知消失: ④点击更换收件邮箱,跳转至注册页 1.点击邮箱链接跳转至相应邮箱

  • PHP+jQuery 注册模块的改进(一):验证码存入SESSION

    需要修改的几个文件: ①register.php 生成随机数和加密值 把register.html改为register.php,并开启session: 把register.js中生成随机数的函数写在register.php中,并改用php方法 <?php session_start();?> .... <?php //生成随机数函数 function showval(){ $num = ""; for($i=0;$i<4;$i++){ $tmp = rand(1

  • PHP+jQuery 注册模块的改进(三):更新到Smarty3.1

    Smarty3.1X( 最新版本 3.1.19) 比起Smarty2.x修改了不少特性.我把这个模块使用Smarty3.1.18 ( 下载地址http://www.smarty.net/files/Smarty-3.1.18.zip )重新修改了一遍,是项目文件和目录看起来更干净更有调理. 把Smarty压缩包中的libs文件夹拷贝至模块根目录下,然后根目录创建init.inc.php: 复制代码 代码如下: <?php /**     file:init.inc.php Smarty对象的实例

  • PHP+jQuery 注册模块开发详解

    写了一个简单的PHP+jQuery注册模块,需要填写的栏目包括用户名.邮箱.密码.重复密码和验证码,其中每个栏目需要具备的功能和要求如下图: 在做这个模块的时候,很大程度上借鉴了网易注册(http://reg.163.com/reg/reg.jsp?product=urs)的功能和样式.但网易对于每个栏目的判断的做法是:在输入文字时,并不给出任何实时的检测结果,而在这个栏目失去焦点时,才把检测的结果展示出来,这种做法我认为会使用户在输入时视觉上比较统一,看到的是关于该栏目要求的提示,不会出现其他

  • JAVA实现简单系统登陆注册模块

    前期准备 首先要先明确有个大体的思路,要实现什么样的功能,了解完成整个模块要运用到哪些方面的知识,以及从做的过程中去发现自己的不足.技术方面的进步大都都需要从实践中出来的. 功能:用户注册功能+系统登录功能+生成验证码 知识:窗体设计.数据库设计.JavaBean封装属性.JDBC实现对数据库的连接.验证码(包括彩色验证码)生成技术,还有就些比如像使用正则表达式校验用户注册信息.随机获得字符串.对文本可用字符数的控制等 设计的模块预览图: 彩色验证码预览图: 所用数据库:MySQL 数据库设计

  • IOS开发用户登录注册模块所遇到的问题

    最近和另外一位同事负责公司登录和用户中心模块的开发工作,开发周期计划两周,减去和产品和接口的协调时间,再减去由于原型图和接口的问题,导致强迫症纠结症状高发,情绪不稳定耗费的时间,能在两周基本完成也算是个不小的奇迹了.本文就总结一下如何满足产品需要的情况下,高效开发一个登录注册模块. 1.利用继承解决界面重复性功能.通常登录注册会有一个独立的设计,而模块内部会有有相似的背景,相似的导航栏样式,相似返回和退出行为,相似的输入框,按钮样式等. 比如上面的的注册和登录模块,就有相同的返回按钮,相同的背景

  • vue3如何优雅的实现移动端登录注册模块

    前言 近期开发的移动端项目直接上了 vue3 ,新特性 composition api 确实带来了全新的开发体验.开发者在使用这些特性时可以将高耦合的状态和方法放在一起统一管理,并能视具体情况将高度复用的逻辑代码单独封装起来,这对提升整体代码架构的健壮性很有帮助. 如今新启动的每个移动端项目基本上都包含注册登录模块,本次实践过程中针对登录注册中的表单控件做了一些经验上的总结,通过抽离提取共性代码来提升代码的可维护性和开发效率. 接下来观察一下美工同学提供的图片. 注册页面 登录页面 忘记密码页面

  • Vue注册模块与登录状态的持久化实现方法详解

    目录 整体框架 1. 前端页面授权 2. 实现注册页面 3. 实现登录状态的持久化 优化前端 整体框架 1. 前端页面授权 当我们登录网站的时候,如果没有登录,强制让用户重定向到 登录界面 在 router 目录下的 index.js 文件下实现. router -> index.js import store from '../store/index' // 把一些额外信息放到一个额外的域里面,meta信息里面存一下是否要授权,如果需要授权而且没有登录,重定向到登录页面,重定向到登录界面. c

  • Jquery注册事件实现方法

    本文实例讲述了Jquery注册事件实现方法.分享给大家供大家参考.具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head

  • Ajax+asp应用实例 注册模块,表单提交

    <!--注册模块-->default.asp 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <hea

随机推荐