PHP结合jQuery实现找回密码

通常所说的密码找回功能不是真的能把忘记的密码找回,因为我们的密码是加密保存的,一般开发者会在验证用户信息后通过程序生成一个新密码或者生成一个特定的链接并发送邮件到用户邮箱,用户从邮箱链接到网站的重置密码模块重新设置新密码。

当然现在有的网站也有手机短信的方式找回密码,原理就是通过发送验证码来验明正身,和发送邮件验证一样,最终还是要通过重置密码来完成找回密码的流程。

一般步骤是:

1.表单输入注册时的邮箱;
2.验证用户邮箱是否正确,如果用户邮箱不存在网站的用户表中,则提示用户邮箱未注册;
3.发送邮件,如果用户邮箱确实存在用户表中,则组合用于验证用户信息的字符串,并构造URL发送到用户邮箱中;
4.用户登录邮箱收取邮件,点击URL链接到网站验证程序;
5.网站程序通过用户请求的字符串查询本地用户表,比对用户信息是否正确;
6.如果正确则转到重置密码页面重新设置新密码,反之则提示用户验证无效。

HTML

我们在找回密码的页面上放置一个要求用户输入注册时所用的邮箱,然后提交前台js来处理交互。


<p><strong>输入您注册的电子邮箱,找回密码:</strong></p>
<p><input type="text" class="input" name="email" id="email"><span id="chkmsg"></span></p>
<p><input type="button" class="btn" id="sub_btn" value="提 交"></p>

jQuery

当用户输入完邮箱并点击提交后,jQuery先验证邮箱格式是否正确,如果正确则通过向后台sendmail.php发送Ajax请求,sendmail.php负责验证邮箱是否存在和发送邮件,并会返回相应的处理结果给前台页面,请看jQuery代码:


$(function(){
  $("#sub_btn").click(function(){
    var email = $("#email").val();
    var preg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/; //匹配Email
    if(email=='' || !preg.test(email)){
      $("#chkmsg").html("请填写正确的邮箱!");
    }else{
      $("#sub_btn").attr("disabled","disabled").val('提交中..').css("cursor","default");
      $.post("sendmail.php",{mail:email},function(msg){
        if(msg=="noreg"){
          $("#chkmsg").html("该邮箱尚未注册!");
          $("#sub_btn").removeAttr("disabled").val('提 交').css("cursor","pointer");
        }else{
          $(".demo").html("<h3>"+msg+"</h3>");
        }
      });
    }
  });
})

以上使用的jQuery代码很方便简洁的完成了前端交互操作,如果您有一定的jQuery基础,那上面的代码一目了然,不多解释。
当然别忘了在页面中加载jQuery库文件,有的同学经常问我说从jb51.net下载了demo怎么用不了,那80%是jquery或者其他文件加载路径错了导致没加载必要的文件。

PHP

sendmail.php需要验证Email是否存在系统用户表中,如果有,则读取用户信息,将用户id、用户名和密码惊醒md5加密生成一个特别的字符串作为找回密码的验证码,然后构造URL。同时我们为了控制URL链接的时效性,将记录用户提交找回密码动作的操作时间,最后调用邮件发送类发送邮件到用户邮箱,发送邮件类smtp.class.php已经打包好,请下载。


include_once("connect.php");//连接数据库 

$email = stripslashes(trim($_POST['mail'])); 

$sql = "select id,username,password from `t_user` where `email`='$email'";
$query = mysql_query($sql);
$num = mysql_num_rows($query);
if($num==0){//该邮箱尚未注册!
  echo 'noreg';
  exit;
}else{
  $row = mysql_fetch_array($query);
  $getpasstime = time();
  $uid = $row['id'];
  $token = md5($uid.$row['username'].$row['password']);//组合验证码
  $url = "http://www.jb51.net/demo/resetpass/reset.php?email=".$email."
&token=".$token;//构造URL
  $time = date('Y-m-d H:i');
  $result = sendmail($time,$email,$url);
  if($result==1){//邮件发送成功
    $msg = '系统已向您的邮箱发送了一封邮件<br/>请登录到您的邮箱及时重置您的密码!';
    //更新数据发送时间
    mysql_query("update `t_user` set `getpasstime`='$getpasstime' where id='$uid '");
  }else{
    $msg = $result;
  }
  echo $msg;
} 

//发送邮件
function sendmail($time,$email,$url){
  include_once("smtp.class.php");
  $smtpserver = ""; //SMTP服务器,如smtp.163.com
  $smtpserverport = 25; //SMTP服务器端口
  $smtpusermail = ""; //SMTP服务器的用户邮箱
  $smtpuser = ""; //SMTP服务器的用户帐号
  $smtppass = ""; //SMTP服务器的用户密码
  $smtp = new Smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass);
  //这里面的一个true是表示使用身份验证,否则不使用身份验证.
  $emailtype = "HTML"; //信件类型,文本:text;网页:HTML
  $smtpemailto = $email;
  $smtpemailfrom = $smtpusermail;
  $emailsubject = "jb51.net - 找回密码";
  $emailbody = "亲爱的".$email.":<br/>您在".$time."提交了找回密码请求。请点击下面的链接重置密码
(按钮24小时内有效)。<br/><a href='".$url."'target='_blank'>".$url."</a>";
  $rs = $smtp->sendmail($smtpemailto, $smtpemailfrom, $emailsubject, $emailbody, $emailtype); 

  return $rs;
}

好了,这个时候你的邮箱将会收到一封来自helloweba的密码找回邮件,邮件内容中有一个URL链接,点击该链接到jb51.net的reset.php来验证邮箱。


include_once("connect.php");//连接数据库 

$token = stripslashes(trim($_GET['token']));
$email = stripslashes(trim($_GET['email']));
$sql = "select * from `t_user` where email='$email'"; 

$query = mysql_query($sql);
$row = mysql_fetch_array($query);
if($row){
  $mt = md5($row['id'].$row['username'].$row['password']);
  if($mt==$token){
    if(time()-$row['getpasstime']>24*60*60){
      $msg = '该链接已过期!';
    }else{
      //重置密码...
      $msg = '请重新设置密码,显示重置密码表单,<br/>这里只是演示,略过。';
    }
  }else{
    $msg = '无效的链接';
  }
}else{
  $msg = '错误的链接!';
}
echo $msg;

reset.php首先接受参数email和token,然后根据email查询数据表t_user中是否存在该Email,如果存在则获取该用户的信息,并且和sendmail.php中的token组合方式一样构建token值,然后与url传过来的token进行对比,如果当前时间与发送邮件时的时间相差超过24小时的,则提示“该链接已过期!”,反之,则说明链接有效,并且调转到重置密码页面,最后就是用户自己设置新密码了。

小结:通过注册邮箱验证与本文邮件找回密码,我们知道发送邮件在网站开发中的应用以及它的重要性,当然,现在也流行短信验证应用,这个需要相关的短信接口对接就可以了。
最后,附上数据表t_user结构:


CREATE TABLE `t_user` (
 `id` int(11) NOT NULL auto_increment,
 `username` varchar(30) NOT NULL,
 `password` varchar(32) NOT NULL,
 `email` varchar(50) NOT NULL,
 `getpasstime` int(10) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

以上所述就是本文的全部内容了,希望大家能够喜欢。

(0)

相关推荐

  • 基于JQuery的密码强度验证代码

       因为是基于JQuery的控件,当然需要JQuery库,还要一个本控件的JS.JQuery的JS大家可以到官网下载:http://code.jquery.com/jquery-1.4.2.min.js 这个控件的JS文件:password_strength_plugin.js password_strength_plugin.js 复制代码 代码如下: (function($){ $.fn.shortPass = 'Too short'; $.fn.badPass = 'Weak'; $.f

  • jQuery判断密码强度实现思路及代码

    复制代码 代码如下: <head> <title></title> <script src="jquery-1.9.1.js" type="text/javascript"></script> <style type="text/css"> .qiang{background:url(/images/pas4.JPG) no-repeat;width:150px;height

  • jQuery插件passwordStrength密码强度指标详解

    passwordStrength插件能够根据用户输入的密码,以图形化方式显示密码的强度. <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>passwordStrength</title> <link href="css/style.css" rel=

  • jQuery MD5加密实现代码

    $(md("你想要加密的字符串")); md5插件下载地址:http://xiazai.jb51.net/201003/yuanma/jquery_md5.rar 下面是我的简单例子 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"

  • jQuery实现提示密码强度的代码

    如何实现色条随输入密码长度变化效果: 在很多网站注册页面都有这样的功能,当用户输入密码的时候,下面会出现一个色条,色条的长度会跟随输入密码的长度变化,并且色条的颜色也会根据输入密码长度的不同有所改变,一般是用来提示密码强度.下面就简单介绍一下使用jQuery如何实现此功能.代码实例如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>我们</tit

  • jQuery简单实现MD5加密的方法

    本文实例讲述了jQuery简单实现MD5加密的方法.分享给大家供大家参考,具体如下: 1.问题背景 有两个输入框,一个输入明文,另一个输入框显示密文 2.实现源码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>jQuery实现MD5加密</title> <script type="text/javascript"

  • jQuery随机密码生成的方法

    本文实例讲述了jQuery随机密码生成的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: $.extend({   password: function (length, special) {     var iteration = 0;     var password = "";     var randomNumber;     if(special == undefined){         var special = false;     }     w

  • jquery密码强度校验

    本文实例讲述了jquery密码强度校验的验证代码,分享给大家供大家参考.具体如下: 预想的效果截图如下: 关键代码: <script> //下面的正则表达式建议各位收藏哦,项目上有可能会用得着 $(function(){ $('#pass').blur(function(e) { // alert('---------'); //密码为八位及以上并且字母数字特殊字符三项都包括 var strongRegex = new RegExp("^(?=.{8,})(?=.*[A-Z])(?=

  • jQuery ajax MD5实现用户注册即时验证功能

    实际项目中比较常用的(JQuery+AJAX+MD5),属于即时验证,亮点是验证用户是否存在的那一项,具体内容如下 具体示例 registe.jsp <span style="font-size: large;"><%@ page pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"

  • jquery插件开发之实现md5插件

    方法返回的是一串十进制数,在jquery1.9.2下测试通过. 复制代码 代码如下: (function($){ $.md5 = function(o) {  if(null === o) {   return 'null';  }  if(typeof o != "string") {   return 'null';  }  //计算填充的长度  var fill_data_len = 0;  var data_len = o.length;  var d_l_mod = data

  • 密码框显示提示文字jquery示例

    复制代码 代码如下: <html> <head> <title>登录</title> <script type="text/javascript" src="./jquery-1.3.2.min.js"></script> <script> $(document).ready(function(){ $(".text_login").focus(function(

  • jQuery实现密保互斥问题解决方案

    密保互斥问题: 密保通常都会有n个问题,让用户选择其中2.3个,而且都不会让用户选择重复的问题.这就要求密保互斥. 效果如下: 下面我用了jquery实现密保互斥,用于解决密保,投票等类似互斥问题,可以支持ie6+,火狐,谷歌,opera等大多数浏览器 demo下载:http://download.csdn.net/download/cwqcwk1/5956141 关键代码: 复制代码 代码如下: <script type="text/javascript"> var qO

  • jquery判断输入密码两次是否相等

    Jquery easyui是一个非常好的ui框架,但是表单验证中没有最常用的判断两个输出框中值相等的验证,所以我做了下扩展. $.extend($.fn.validatebox.defaults.rules, { /*必须和某个字段相等*/ equalTo: { validator:function(value,param){ return $(param[0]).val() == value; }, message:'字段不匹配' } }); 使用示例: 密码: <input id="p

随机推荐