javascript
php
一般所說的密碼找回功能不是真的能把忘記的密碼找回,由於咱們的密碼是加密保存的,通常開發者會在驗證用戶信息後經過程序生成一個新密碼或者生成一個特定的連接併發送郵件到用戶郵箱,用戶從郵箱連接到網站的重置密碼模塊從新設置新密碼。css
固然如今有的網站也有手機短信的方式找回密碼,原理就是經過發送驗證碼來驗明正身,和發送郵件驗證同樣,最終仍是要經過重置密碼來完成找回密碼的流程。
密碼找回的功能,通常步驟是:html
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代碼:java
$(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基礎,那上面的代碼一目瞭然,很少解釋。mysql
PHP
sendmail.php須要驗證Email是否存在系統用戶表中,若是有,則讀取用戶信息,將用戶id、用戶名和密碼驚醒md5加密生成一個特別的字符串做爲找回密碼的驗證碼,而後構造URL。同時咱們爲了控制URL連接的時效性,將記錄用戶提交找回密碼動做的操做時間,最後調用郵件發送類發送郵件到用戶郵箱,發送郵件類smtp.class.php已經打包好,請下載。web
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.helloweba.com/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 = "Helloweba.com - 找回密碼"; $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連接,點擊該連接到helloweba.com的reset.php來驗證郵箱。sql
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小時的,則提示「該連接已過時!」,反之,則說明連接有效,而且調轉到重置密碼頁面,最後就是用戶本身設置新密碼了數據庫
知識點補充:
http://www.w3school.com.cn/php/php_mysql_connect.asp
在您可以訪問並處理數據庫中的數據以前,您必須建立到達數據庫的鏈接。
在 PHP 中,這個任務經過 mysql_connect() 函數完成。
mysql_connect(servername,username,password);
參數 | 描述 |
---|---|
servername | 可選。規定要鏈接的服務器。默認是 "localhost:3306"。 |
username | 可選。規定登陸所使用的用戶名。默認值是擁有服務器進程的用戶的名稱。 |
password | 可選。規定登陸所用的密碼。默認是 ""。 |
註釋:雖然還存在其餘的參數,但上面列出了最重要的參數。請訪問 W3School 提供的 PHP MySQL 參考手冊,得到更多的細節信息。
在下面的例子中,咱們在一個變量中 ($con) 存放了在腳本中供稍後使用的鏈接。若是鏈接失敗,將執行 "die" 部分:
<?php $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Could not connect: ' . mysql_error()); } // some code ?>
腳本一結束,就會關閉鏈接。如需提早關閉鏈接,請使用 mysql_close() 函數。
<?php $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Could not connect: ' . mysql_error()); } // some code mysql_close($con); ?>