1. 程式人生 > >登入介面記住密碼之jquery.cookie.js和md5.js

登入介面記住密碼之jquery.cookie.js和md5.js

  最近做了個登入介面,要實現記住密碼效果,然而看似很簡單,做起來略複雜。我就在不斷改進中,有如下成果,如果可以優化,或有什麼問題,可以評論留言。

    首先,需下載jquery.cookie.js,和md5.js。

   介紹一下這兩個js檔案,jquery.cookie.js 是提供了一些建立cookie的API介面的js檔案,也可以自己寫,md5.js是用來對密碼進行MD5方式的加密。

   再介紹下cookie.js的一般方法

   cookie儲存在客戶端,儲存方式類似於text,且以鍵值對的形式儲存,即key->value。

   建立cookie

    $.cookie(鍵名,值,儲存時長)     //儲存時長的寫法為{expires:number,path:'/'},expires是要儲存的天數,path是儲存的路徑,一般為'/'。

   刪除cookie,只用將天數設為-1即可。

   取cookie的值

   $.cookie(鍵名)       //返回字串型別的鍵名所對應的值。

   本次所用的md5.js 只有32位加密,而我修改了md5.js 的功能,使他能進行16位加密,所以方法改為$.md5(xxx,16),如果沒有對js檔案進行修改,其方法為$.md5(xxx);

   在上程式碼前,須有幾點強調,首先,加有cookie功能的程式碼需在本地伺服器上實現,乾癟癟的html是無法實現cookie的功能。

   其次,必須下對正確的jquery.cookie.js。

  再次,如果想實時檢視cookie的內容,建議用Firefox瀏覽器,因為有較簡單查詢cookie的方法

   最後,md5.js 只是更好地與資料庫互動,在前端就對密碼加密,你可以使用資料庫的加密方法實現。

   特別說明的是,記住密碼功能不一定由cookie實現,可以使用html5的localstorage來實現。


   <script type="text/javascript" src="scripts/jquery-1.8.1.min.js"></script>   

   <script type="text/javascript" src="scripts/jquery.cookie.js"></script>   

    <script type="text/javascript" src="scripts/md5.js"></script>    

   <body> 

    <label  for="Username">使用者名稱:</label>

    <input type="text" id="Username" />

     <span id="error1" style="color:red;font-size:large;"></span>

    <label    for="PSD">密碼:</label>

   <input type="password" id="PSD" />

   <span id="error2" style="color:red;font-size:large;"></span>

   <input   type="checkbox"  id="Remember" /><label for="Remember">記住密碼</label>

   <input type="button"  value="登入"  onclick="login()" />

    <input type="reset"  onclick="IsReset()"  />

   </body>

<script type="text/javascript">

        $(document).ready(function() {
            //將獲取的值填充入輸入框中
            var lastUser = $.cookie('Last');                                            //獲取cookie中其鍵名為Last對應的值
            var Isre = document.getElementById("Remember");
            var userId = $('#Username');
            var code = $('#PSD');
            if (lastUser != undefined) {                                                 //如果對應的鍵有值,則填充到登入框中,作出響應
                userId.val($.cookie("UN" + lastUser));
                code.val("****");                                                                //應把鍵名取得特別點,防止跟其他的cookie衝突,要保證名字的唯一性
                Isre.checked = true;
            } else {
                userId.val("");                                                                  //否則輸入框內容為空
            }
        });

        function IsReset() {                                                            //重置函式,so easy 不做說明
            $('#Username').val("");
            $('#PSD').val("");
            document.getElementById("Remember").checked = false;
        }


        function immediately() {                                                                             //立即操作,如果不想登入記住的使用者,意圖對使用者名稱修改,則會呼叫此函式
            var element = document.getElementById("Username");
            if ("\v" == "v") {                                                                                          //驗證所用的瀏覽器是否為IE,如果是則用IE特有的方法新增監聽事件
                element.onpropertychange = webChange;   
            } else {
                element.addEventListener("input", webChange, false);            //一般瀏覽器新增監聽事件的方法,將方法webChange與id="Username"的輸入框繫結
            }                                                                                                                 //當狀態改變時,則呼叫webChange90()


            function webChange() {
                var user = $("#Username").val();
                var mdcode = $.cookie("PSD" + user);
                var code = $("#PSD");
                var Isrem = document.getElementById("Remember");
                if (mdcode != undefined&&mdcode!="") {                                       //因為密碼經md5加密,不能全部顯示到登入框中,所以cookie中記住的密碼顯示在框中的是****
                    code.val("****");                                                                               //而不是真正的密碼和加密後的密碼
                    Isrem.checked = true;
                } else {                                                                                                      //如果cookie中沒有相應的資訊,未匹配成功,則密碼輸入框為空
                    code.val("");
                    Isrem.checked = false;
                }
            }
        }
        immediately();


        function login() {             
            //異常判斷...    

            var json = "";
            var username = $("#Username").val();                                            
            var psd = $("#PSD").val();
            if (username == "") {
                $("#error1").text("*");
            } else { $("#error1").text(""); }
            if (psd == "") {
                $("#error2").text("*");
            } else { $("#error2").text(""); }                                    //以上函式是對輸入框是否有值,進行判斷,如果沒有,則顯示星星,以提示你未填登入資訊

            
            if (!(username == "" || psd == "")) {                           //如果填完了資訊,則進行如下判斷
                var Isre = document.getElementById("Remember");
                if (Isre.checked && $.cookie("IR" + username)) {                   //IR+username鍵名對應儲存的資訊是真假,用來標記username是否被記住過,即在cookie中是否有儲存
                    var mycode = $.cookie("PSD" + username);

                    var  renewcode=$.md5(psd,16);

                    $.cookie("IR" + username, 'true', { expires: 7, path: '/' });
                    $.cookie("UN" + username, username, { expires: 7, path: '/' });
                                                                                                                         //取密碼框中的資料,如果是****則說明cookie中有值,不相同的就儲存新的。
                    if (psd == "****")
                        {

                            $.cookie("PSD" + username, mycode, { expires: 7, path: '/' });

                             json = '{"USERNAME": "' + username + '", "PSD": "' +mycode+'" }'; 

                        }
                    else
                       {

                             $.cookie("PSD" + username, renewcode, { expires: 7, path: '/' });

                             json = '{"USERNAME": "' + username + '", "PSD": "' +renewcode +'" }'; 

                       }
                    $.cookie("LAST", username, { expires: 7, path: '/' });
                } else
                    if (Isre.checked == true&& $.cookie("IR" + username)==undefined) {//如果記住密碼的checked為真,且是新使用者則繼續儲存使用者名稱和密碼,

                                                                                                                                               //大家可以細細體會為什麼要與上面分開寫
                    $.cookie("LAST", username, { expires: 7, path: '/' });                //LAST記住的是最近登入的使用者名稱
                    $.cookie("IR" + username, 'true', { expires: 7, path: '/' });         //IR記住的是username是否在cookie中
                    $.cookie("UN" + username, username, { expires: 7, path: '/' });//UN記住的是使用者名稱
                    $.cookie("PSD" + username, $.md5(psd,16), { expires: 7, path: '/' });//PSD記住的是加密後的密碼


                } else 

                   if(Isre.checked==false&&$.cookie("IR" + username))  //將原有最近的記住的密碼取消記住

                  {

                          json = '{"USERNAME": "' + username + '", "PSD": "' +$.cookie("PSD"+username) +'" }';
                     if (username == $.cookie('LAST'))                                               //如果LAST對應的值被登入即最近登入的賬號且未點選checkbox,則將cookie中對應user的資訊刪除
                          $.cookie('LAST', '', { expire: -1, path: '/' });                                 //我沒有想到更好的辦法解決找最近登入的上一個登入的賬號
                    $.cookie("IR" + username, '', { expires: -1, path: '/' });
                    $.cookie("UN" + username, '', { expires: -1, path: '/' });
                    $.cookie("PSD" + username, '', { expires: -1, path: '/' });
                }else                       //新密碼且不記住

                  {  json = '{"USERNAME": "' + username + '", "PSD": "' +$.md5(psd)+'" }'; }

            //與資料庫連線驗證程式碼,不給出
            }
        }

</script>