クッキーはパスワードと自動登録を覚える機能を実現します.

50526 ワード

1.需要分析:
今は元のページでユーザー名とパスワードを入力してパスワードを覚えるボタンをクリックしてログインインターフェースに成功し、ログアウトをクリックして元のページを更新します.元のページには前回のユーザー名とパスワードが自動的に保存されています.ユーザーが自動ログインをクリックすると、ログインを終了して元のページを更新し、元のページにユーザー名とパスワードが表示され、500 ms後に自動的にログイン画面に入ります.ユーザーがログイン画面に入ったら、再度ページを更新してもログイン画面に留まります.注意:ここのオリジナルページと登録ページは一つのページに書いてあります.透明度と階層で現在どのページを表示するべきかを区別します.
2.ソリューション
  • 注:パスワードを覚えているクッキーの名前はremMeで、自動登録したクッキーの名前はautユーザ名のクッキーの名前はusernameで、パスワードのクッキーの名前はpassword
  • です.
  • 注:cookie名はnameという意味で登録状態を保存しています.name値はtrueであると常にログイン画面にあります.このcookieがないと登録を終了します.このクッキーはNodeJsで設定し、削除しました.
  • 補足知識:どうやってフロントエンドjsで対応するクッキーを得ることができますか?
  • //  cookie  name value 
     function getCookie(name){
       var cookieArray=document.cookie.split(";");
       for(var i=0;i<cookieArray.length;++i){
        var cookies=cookieArray[i].split("=");
        if(cookies[0].trim()==name){
         return cookies[1];
        }
       }
       if(i==cookieArray.length){
        return "";
       }
      }
      //    cname,  cvalue,     exdays  cookie
      //d.getTime()   1970          
      //d.toGMTString()   :Thu, 20 Feb 2020 07:54:01 GMT   
       function SetCookie(cname,cvalue,exdays){
           var d = new Date();
           d.setTime(d.getTime()+(exdays*24*60*60*1000));
           var expires = "expires="+d.toGMTString();
           document.cookie = cname + "=" + cvalue + "; " + expires;
      }
    1.クッキーのみを使用して、フロントエンドjsにクッキーを設定し、クッキー分析を削除します.(1)フロントエンドjsでログイン確認イベントを傍受できます.クリックして決定すれば、パスワードと自動登録がクリックされたかどうかを覚えてクッキーを設定します.クリックして設定した値がtrueであれば、該当するクッキーの値をfalseに設定します.また、ユーザー名とパスワードを保存するために、二つのクッキーを追加して設定する必要があります.パスワードを覚えたり、自動登録したりすると、この二つのクッキーが生成されます.そうでないと削除されます.(2)ページを更新する際、フロントエンドjsは、現在のページのremMe、autの2つのcookieの値がtrueまたはfalseであると判断し、cookieをusernameとpasswordという名前の値を元のページのユーザ名とパスワードのinput枠と、クッキー名でnameという値で登録画面が表示されるかどうかを判断する.一部のコードは以下の通りです.注:これは対象として書いたものです.この二つの方法は一つの対象に書いたものです.
    //that.remember        ,that.remember1        
    //that.buttonTwo        
    //    (1)  
    rememberFunction: function(){
      var that=this;
      function addButtonTwo(){
    	   if(that.remember.checked==true&&that.te2.value!="      "&&that.pa2.value!="     "){
    		    var name=that.te2.value;
    		    var pass=that.pa2.value;
    		    SetCookie("remMe","true",1);
    		    SetCookie("username",name,1);
    		    SetCookie("password",pass,1);    
    	    }else{
    	            SetCookie("remMe","false",1);
    		    if(that.remember1.checked==false){
    			     SetCookie("username","",-1);
    			     SetCookie("password","",-1);
    		    }
                }
    	   if(that.remember1.checked==true&&that.te2.value!="      "&&that.pa2.value!="     "){
    		    var name=that.te2.value;
    		    var pass=that.pa2.value;
    		    SetCookie("auto","true",1);
    		    SetCookie("username",name,1);
    		    SetCookie("password",pass,1);
    	    }else{
    		    SetCookie("auto","false",1);
    		    if(that.remember.checked==false){
    		     SetCookie("username","",-1);
    		     SetCookie("password","",-1);
    		    }  
                }
         }
         that.buttonTwo.addEventListener('click',addButtonTwo);
     },
     //    (2)  
     //that.page2     , that.wrapper     , 
     //that.load               
     //that.te2        input ,that.pa2       input 
     windowOnload: function(){
    	  var that=this;
    	  window.onload=function(){
    		   that.load.onmouseenter();
    		   if(getCookie('name')){
    			    that.page2.style.opacity=1;
    			    that.page2.style.zIndex=1;
    			    that.wrapper.style.opacity=0;
    			    that.wrapper.style.zIndex=0;
    		   }else{
    			   if(getCookie('remMe')=='true'){
    				     that.remember.checked=true;
    				     that.te2.value=getCookie('username');
    				     that.pa2.value=getCookie('password');
    				     that.te2.style.color="#000";
    				     that.pa2.style.color="#000";
    		           }else if(getCookie('remMe')=='false'){
    				     if(getCookie('auto')=='false'){
    					      SetCookie("username","",-1);
    					      SetCookie("password","",-1);
    				     }
    			    }
    		            if(getCookie('auto')=='true'){
    				     that.remember1.checked=true;
    				     that.te2.value=getCookie('username');
    				     that.pa2.value=getCookie('password');
    				     that.te2.style.color="#000";
    				     that.pa2.style.color="#000";
    				     setTimeout(function(){
    					      if(that.remember1.checked== "true"){
    					          SetCookie("name","true",30);
    					          that.page2.style.opacity=1;
    					          that.page2.style.zIndex=1;
    					          that.wrapper.style.opacity=0;
    					          that.wrapper.style.zIndex=0;
    					      }
    				    },500);
    			     }else{
                                       if(getCookie('remMe')=='false'){
    				      SetCookie("username","",-1);
    				      SetCookie("password","",-1);
    				     }
    		             }
    	         }
    	 }
    }
    2.cookieのみを使用して、NodeJsにクッキーを設定し、先端jsにcookie分析を削除します.忘れないでください.jsにcookieを作成するのは明らかに極めて危険です.そこで、(1)ログインボタンをクリックするたびに、ajaxがバックグラウンドのユーザ情報に「check=...&check 1=...」を携帯するように改善しました.checkはパスワードを覚えている状態で、値はtrueまたはfalseで、check 1は自動登録の状態で、値はcheckと同じです.そして、NodeJsのバックグラウンドでチェック値とcheckの判断とユーザ名とパスワードの判断を行い、ログインに成功したら、checkとcheck 1の値がfalseであれば、ユーザ名とパスワードのクッキーを削除し、もしcheckがtrueまたはcheck 1ビットtrueであれば、ユーザ名とパスワードのクッキーを設定する.remMe,aut,nameの3つのcookieを同時に設定します.(2)同じ案の中の分析(2)は、関数の実現もシナリオの一つのwindow Onload関数と同じである.
    部分コードは以下の通りです
    //NodeJs    (1)
    //  --->     MySql   
    function select(name){
     //  
         var p=new Promise(function(resolve,reject){
                var sql='SELECT test_name,test_pass FROM websites WHERE test_name=?';
                var f=[];
                f.push(name);
                connection.query(sql,f,function(err,result){
                      if(err){
                               console.log('[SELECT ERROR]-',err.message);
                      }else{
    			    var dataString=JSON.stringify(result);
    			    var data=JSON.parse(dataString);
    			    console.log('data[0] : ',data[0]);
    			    resolve(data[0]);
    	          }
    	 }
          })
         return p;
    }
    //    ----->GET
    server.use('/login',function(req,res){
    	 var name=req.query['name'];
    	 var pass=req.query['pass'];
    	 var check=req.query['check'];
    	 var check1=req.query['check1'];
    	 //1.        
    	 //2.          
    	 var test=select(name);
    	 var users;
    	 test.then(function(data){
    	     users=data;
    	     //         users={name:"222",pass:"333",check:0}
    	     console.log('       : ',users);
    	     if(users==undefined){
    	         res.send({ok:false,msg:"      "});
    	     }else if(users["test_pass"]!=pass){
    	         res.send({ok:false,msg:"        "});
    	     }else{
    	           if(check=='true'||check1=='true'){
    	               res.cookie('username',name,{path:'/',maxAge:1000*3600*24});
    	               res.cookie('password',pass,{path:'/',maxAge:1000*3600*24});
    	            }else if(check=='false'&&check1=='false'){
    	               res.cookie('username',name,{path:'/',maxAge:-1});
    	               res.cookie('password',pass,{path:'/',maxAge:-1});
    	            }
    	            res.cookie('name',"true",{path:'/',maxAge:1000*3600*24*30});
    	            res.cookie('remMe',check,{path:'/',maxAge:1000*3600*24});
    	            res.cookie('auto',check1,{path:'/',maxAge:1000*3600*24});
    	            res.send({ok:true,msg:"    "});
    	    }
         })
    })
    //  ------>GET
    server.use('/quit',function(req,res){
        res.clearCookie('name');
        res.send('    。         ');
    })
    3.cookieとseesionは全部使います.NodeJsでcookieにユーザ名のみを保存し、sessionに完全なユーザ名とユーザパスワードを保存するよう設定します.
    解析:一般的には、ユーザーパスワードというプライバシーの情報は、フロントエンドページに直接さらさないほうがいいです.私たちはソリューションを改善し続けて、ユーザー情報をsessionに保存します.(1)ログイン確認ボタンをクリックした後、NodeJsはログインが成功すれば、ログインが成功すれば、checkがtrueまたはcheck 1であり、userオブジェクトを設定し、属性はusernameとpasswordであり、ユーザー名とパスワードをsessionに保存する.そしてユーザー名usernameというcookieを設定します.checkとcheck 1は共にfalseであり、usernameというcookieを削除し、req.session.userというsessionの対象を削除する.パスワードcheckを覚えて、自動的にcheck 1に登録して、状態nameの3つの対応するcookieを登録します.(2)インターフェースを更新する時、この二つのクッキー:checkがtrueまたはcheck 1がtrueであれば、ajax要求を送信してreq.session.user.passwordを取得する.この値をパスワードのinputボックスに入れて、ユーザー名のinputボックスにクッキー名を入れます.問題:分析(2)の中のajax要求を更新しながらajax要求を送信すると、いつも実現しにくくなります.毎回、インターフェースを更新した後のパスワードinputボックスにはいつも値がありません.このスキームのコードは完了していません.
    3.補足:cookieドメインをまたぐ解決
    cookieはクライアントに格納されています.私たちはバックグラウンドNodeJsにres.header("Access-Control-Allow-Origin","*");を設けてもajaxクロスドメインを実現することができず、ajaxクロスドメインを実現することができません.cookieを連れてきます.この問題はどう解決しますか?
  • フロントエンドJSがajax要求を書く時
  •     xhr.open('get',url,true);
        //  cookie   3
        xhr.withCredentials = true;
        xhr.send(null);
  • NodeJs中
  • server.use('*',function(req,res,next){
         //  cookie   1
         res.header("Access-Control-Allow-Origin",req.headers.origin);
         //  cookie   2
         res.header("Access-Control-Allow-Credentials",true);
         res.header("Access-Control-Allow-Headers","Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild");
         res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
         next();
    })