一步一步學asp.net_Ajax登錄設計


Ajax登錄設計

任務需求:做一個登錄,擁有自動記住賬號和密碼的功能,要保證安全性,ajax,無刷新,良好的用戶體驗.(母板頁)

這是前台頁面,要求實現用戶登錄

clip_image002

首先我們分析,

用戶需求:

1. 登錄以后,登錄框隱藏,並且歡迎登錄的框顯示,並且,左上角登錄的按鈕消失,安全退出顯示.

2. 如果選擇記住帳號和密碼,下次登錄直接登錄,並且保證安全性.

實現過程:

首先,登錄的時候發出ajax請求,用戶驗證登錄,登錄以后,保存當前用戶名和密碼到cookies中,注意,密碼要用md5加密,md5是根據用戶的機器配置生成的,並且返回登錄狀態和用戶名的json數據

第二次登錄的時候,檢測用戶狀態,如果用戶cookies保存的用戶名和密碼,根據用戶名讀取用戶密碼,並進行md5加密,檢驗兩次密碼是否相同,如果相同就返回json數據,登錄狀態true和用戶名,如果cookies中只有用戶名,那么返回登錄狀態為false和用戶名

前台主要代碼:

   1:  <%@ Master Language="C#" AutoEventWireup="true" CodeFile="Left_Top_Dwon.master.cs" 
   2:      Inherits="Left_Top_Dwon" %>
   3:   
   4:  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
   5:  <html xmlns="http://www.w3.org/1999/xhtml"> 
   6:  <head id="Head1" runat="server"> 
   7:      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
   8:      <title>無標題文檔</title> 
   9:      <link href="css/top_foot.css" rel="stylesheet" type="text/css" /> 
  10:      <link href="css/style.css" rel="stylesheet" type="text/css" />
  11:   
  12:      <script type="text/javascript" src='<%=ResolveUrl("js/main_nav.js")%>'></script>
  13:   
  14:      <script type="text/javascript" src='<%=ResolveUrl("js/nav.js") %>'></script>
  15:   
  16:      <script src='<%=ResolveUrl("Admin/scripts/jquery-1.7.1.min.js")%> ' type="text/javascript"></script>
  17:   
  18:      <script type="text/javascript"> 
  19:          //檢測登錄狀態 
  20:           function CheckLoginState() 
  21:           { 
  22:              $.ajax({ 
  23:              url:"Member/Data/GetMemberInfo.ashx?method=CheckLoginStatus", 
  24:              type:"post", 
  25:              success:function(data,status){ 
  26:                var jsonInfo= $.parseJSON(data); 
  27:               // alert(data); 
  28:                //同時記住賬號和密碼 
  29:                if(jsonInfo.Status&&jsonInfo.UserName!="") 
  30:                { 
  31:                  $("#divNotLogin").hide(); 
  32:                  $("#divIsLogin").show(); 
  33:                  $("#liLogin").hide(); 
  34:                  $("#liLogout").show(); 
  35:                  $("#lbUserName").text(jsonInfo.UserName); 
  36:                 
  37:                } 
  38:                //如果只記住賬號 
  39:                else if(jsonInfo.Status&&jsonInfo.UserName==""){ 
  40:                   $("#divNotLogin").show(); 
  41:                  $("#divIsLogin").hide(); 
  42:                  $("#liLogin").show(); 
  43:                  $("#liLogout").hide(); 
  44:                  $("#txtUserName").val(jsonInfo.UserName); 
  45:                } 
  46:                else{ 
  47:                  $("#divNotLogin").show(); 
  48:                  $("#divIsLogin").hide(); 
  49:                  $("#liLogin").show(); 
  50:                  $("#liLogout").hide(); 
  51:                } 
  52:                
  53:              } 
  54:           }); 
  55:           } 
  56:          $(function(){ 
  57:          //第一次登錄需要檢測是否自動登錄 
  58:          CheckLoginState(); 
  59:          //獲取新聞類別 
  60:           $.ajax({ 
  61:            url:'<%=ResolveUrl("Admin/News/Data/GetNewsInfo.ashx?method=GetNewsTypeForCombox")%>', 
  62:           type:"get", 
  63:           success:function(text){ 
  64:           var JsonData=$.parseJSON(text); 
  65:             $("#m2").empty();//先清空m2子元素的內容 
  66:             $.each(JsonData,function(key,value){   //注意這里 
  67:                 //這里鏈接還需要添加具體頁面 
  68:               $("#m2").append('<a href=\"'+'<%=ResolveUrl("News/NewsList.aspx?TypeId=")%>'+value.TypeId+'\">'+value.TypeName+'</a>'); 
  69:             }); 
  70:           } 
  71:           }); 
  72:           //獲取工藝知識類別 
  73:          $.ajax({ 
  74:             url:'<%=ResolveUrl("Admin/Product/Data/GetProductInfo.ashx?method=GetTopCraftTypeInfo")%>', 
  75:           type:"get", 
  76:           success:function(text){ 
  77:          
  78:           var JsonData=$.parseJSON(text); 
  79:             $("#m1").empty();//先清空m2子元素的內容 
  80:             $.each(JsonData,function(key,value){   //注意這里 
  81:                 //這里鏈接還需要添加具體頁面 
  82:                 $("#m1").append('<a href=\"'+'<%=ResolveUrl("CraftKnowledge/CraftKnowledgeList.aspx?FId=")%>'+value.FId+'\">'+value.TypeName+'</a>');  
  83:             }); 
  84:           } 
  85:           });
  86:   
  87:           //登錄 
  88:           $("#aLogin").click(function(){ 
  89:           var Name=$("#txtUserName").val(); 
  90:           var pwd=$("#txtPwd").val(); 
  91:           var cbName=$("#cbUserName").attr("checked"); 
  92:           var cbPwd=$("#cbPwd").attr("checked"); 
  93:           if(Name==""||pwd=="") 
  94:           { 
  95:           alert("用戶名或密碼不能為空!"); 
  96:           return; 
  97:           } 
  98:           if(cbName=="checked") 
  99:           cbName="1"; 
 100:           else 
 101:           cbName="0"; 
 102:           if(cbPwd=="checked") 
 103:           cbPwd="1"; 
 104:           else 
 105:           cbPwd="0"; 
 106:          var Data={"Name":Name,"Pwd":pwd,"cbName":cbName,"cbPwd":cbPwd } 
 107:           $.ajax({ 
 108:              url:"Member/Data/GetMemberInfo.ashx?method=MemberLogin", 
 109:              type:"post", 
 110:              data:Data, 
 111:              success:function(ReturnData,status){ 
 112:             var jsonInfo= $.parseJSON(ReturnData); 
 113:                if(jsonInfo.Status) 
 114:                { 
 115:                  
 116:                  $("#divNotLogin").hide(); 
 117:                  $("#divIsLogin").show(); 
 118:                  $("#liLogin").hide(); 
 119:                  $("#liLogout").show(); 
 120:                  $("#lbUserName").text(jsonInfo.UserName); 
 121:                } 
 122:                else{ 
 123:                alert("您輸入的帳號或密碼錯誤!也有可能您的帳號未郵箱激活!"); 
 124:                } 
 125:              
 126:              } 
 127:              
 128:           }); 
 129:           
 130:           }); 
 131:           
 132:          }); 
 133:        
 134:      </script>
 135:   
 136:      <asp:ContentPlaceHolder ID="head" runat="server"> 
 137:      </asp:ContentPlaceHolder> 
 138:  </head> 
 139:  <body> 
 140:      <div class="sheel"> 
 141:          <div class="header"> 
 142:              <div class="top_side"> 
 143:                  <ul> 
 144:                      <li id="liLogin"><a href="#">登錄</a> | </li> 
 145:                      <li><a href="#">注冊</a> </li> 
 146:                      <li>|<a href="#">個人信息</a> </li> 
 147:                      <li>|<a href="#">我的收藏夾</a> </li> 
 148:                      <li>|<a href="#">我的留言</a> </li> 
 149:                      <li>|<a href="#">總站留言</a> </li> 
 150:                      <li id="liLogout">|<a id="A2" href='<%=ResolveUrl("Member/Data/GetMemberInfo.ashx?method=MemberLogout")%>'>安全退出</a></li> 
 151:                  </ul> 
 152:              </div> 
 153:              <div class="nav"> 
 154:                  <ul id="sddm"> 
 155:                      <li><a href="#">首&nbsp;&nbsp;頁</a> </li> 
 156:                      <li><a href="#">工藝概況</a></li> 
 157:                      <li><a href="#" onmouseover="mopen('m1')" onmouseout="mclosetime()">工藝知識</a> 
 158:                          <div id="m1" onmouseover="mcancelclosetime()" onmouseout="mclosetime()"> 
 159:                              <a href="#">大吳泥塑</a> <a href="#">金漆木雕</a> <a href="#">潮州刺綉</a> <a href="#">潮州陶瓷</a> 
 160:                          </div> 
 161:                      </li> 
 162:                      <li><a href="#">作品展覽</a></li> 
 163:                      <li><a href="#">非遺作品</a></li> 
 164:                      <li><a href="#" onmouseover="mopen('m2')" onmouseout="mclosetime()">新聞中心</a> 
 165:                          <div id="m2" onmouseover="mcancelclosetime()" onmouseout="mclosetime()"> 
 166:                              <a href="#">大吳泥塑</a> <a href="#">金漆木雕</a> <a href="#">潮州刺綉</a> <a href="#">潮州陶瓷</a> 
 167:                          </div> 
 168:                      </li> 
 169:                      <li><a href="#">大師風采</a></li> 
 170:                      <li><a href="#">企業展示</a></li> 
 171:                      <li><a href="#">聯系我們</a></li> 
 172:                  </ul> 
 173:              </div> 
 174:          </div> 
 175:          <div class="content"> 
 176:              <div class="left_side"> 
 177:                  <form id="fLogin"> 
 178:                  <div class="logo_bottom"> 
 179:                  </div> 
 180:                  <div class="login"> 
 181:                      <h4> 
 182:                          用戶登錄</h4> 
 183:                      <div class="lg_table" id="divNotLogin"> 
 184:                          <table class="table1" width="198" cellpadding="0" cellspacing="0" border="0"> 
 185:                              <tr> 
 186:                                  <td width="40" align="right"> 
 187:                                      用戶名 
 188:                                  </td> 
 189:                                  <td width="108" align="center"> 
 190:                                      <input type="text" id="txtUserName" name="txtUserName" /> 
 191:                                  </td> 
 192:                                  <td width="50" rowspan="2"> 
 193:                                      <a href="#" id="aLogin"> 
 194:                                          <img src='<%=ResolveUrl("images/login.png")%>' alt="登錄" /></a> 
 195:                                  </td> 
 196:                              </tr> 
 197:                              <tr> 
 198:                                  <td align="right"> 
 199:                                      密碼 
 200:                                  </td> 
 201:                                  <td align="center"> 
 202:                                      <input type="password" name="txtPwd" id="txtPwd" /> 
 203:                                  </td> 
 204:                              </tr> 
 205:                          </table> 
 206:                          <div class="border"> 
 207:                          </div> 
 208:                          <table class="table2" width="190" cellpadding="0" cellspacing="0" border="0"> 
 209:                              <tr> 
 210:                                  <td width="90"> 
 211:                                      <a href="#"> 
 212:                                          <img src='<%=ResolveUrl("images/lg_forget.png")%>' alt="忘記密碼" /></a> 
 213:                                  </td> 
 214:                                  <td width="100"> 
 215:                                      <a href="#"> 
 216:                                          <img src='<%=ResolveUrl("images/zhuce.png")%>' alt="注冊" /></a> 
 217:                                  </td> 
 218:                              </tr> 
 219:                              <tr> 
 220:                                  <td> 
 221:                                      <input type="checkbox" name="cbUserName" id="cbUserName" /><span>記住用戶名</span> 
 222:                                  </td> 
 223:                                  <td> 
 224:                                      <input type="checkbox" name="cbPwd" id="cbPwd" /><span>記住密碼</span> 
 225:                                  </td> 
 226:                              </tr> 
 227:                          </table> 
 228:                      </div> 
 229:                      <div class="lg_table" id="divIsLogin"> 
 230:                          <table id="tbIsLogin" class="table1" width="198" cellpadding="0" cellspacing="0" 
 231:                              border="0"> 
 232:                              <tr> 
 233:                                  <td class="style1" style="height: 90px"> 
 234:                                      <font style="color: Red">歡迎您回來!</font><br /> 
 235:                                      &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 尊敬的的<font style="color: Red"><label id="lbUserName"></label></font>用戶!&nbsp; 
 236:                                  </td> 
 237:                              </tr> 
 238:                              <tr> 
 239:                                  <td align="center" class="style2"> 
 240:                                      <a href="###">查看個人信息</a>&nbsp; | <a id="A1" href='<%=ResolveUrl("Member/Data/GetMemberInfo.ashx?method=MemberLogout")%>'>退出</a> 
 241:                                  </td> 
 242:                              </tr> 
 243:                          </table> 
 244:                      </div> 
 245:                  </div> 
 246:                  </form> 
 247:                  <div class="enter enter1"> 
 248:                      <a href="#"> 
 249:                          <img src='<%=ResolveUrl("images/master.png")%>' alt="大師入口" title="大師入口" /></a></div> 
 250:                  <div class="enter enter2"> 
 251:                      <a href="#"> 
 252:                          <img src='<%=ResolveUrl("images/company.png")%>' alt="企業入口" title="企業入口" /></a></div> 
 253:                  <div class="paihang"> 
 254:                      <h3> 
 255:                          <p class="hide"> 
 256:                              推薦排行榜</p> 
 257:                          <p> 
 258:                              <a href="#">更多</a></p> 
 259:                      </h3> 
 260:                      <ul class="ph_ul" id="ph1"> 
 261:                          <li><a href="#" onmouseover="setph(0);" class="ph_hover">大師推薦</a></li> 
 262:                          <li><a href="#" onmouseover="setph(1);">工藝品推薦</a></li> 
 263:                          <li><a href="#" onmouseover="setph(2);">企業推薦</a></li> 
 264:                      </ul> 
 265:                      <div class="ph_p" id="ph2"> 
 266:                          <ul style="display: block;"> 
 267:                              <li class="ph_li1"><a href="#" class="phplihover">周少君</a></li> 
 268:                              <li class="ph_li2"><a href="#">周少君</a></li> 
 269:                              <li class="ph_li3"><a href="#">周少君</a></li> 
 270:                              <li class="ph_li4"><a href="#">周少君</a></li> 
 271:                              <li class="ph_li5"><a href="#">周少君</a></li> 
 272:                          </ul> 
 273:                          <ul> 
 274:                              <li class="ph_li1"><a href="#" class="phplihover">大大個</a></li> 
 275:                              <li class="ph_li2"><a href="#">大大個</a></li> 
 276:                              <li class="ph_li3"><a href="#">大大個</a></li> 
 277:                              <li class="ph_li4"><a href="#">大大個</a></li> 
 278:                              <li class="ph_li5"><a href="#">大大個</a></li> 
 279:                          </ul> 
 280:                          <ul> 
 281:                              <li class="ph_li1"><a href="#" class="phplihover">小小粒</a></li> 
 282:                              <li class="ph_li2"><a href="#">小小粒</a></li> 
 283:                              <li class="ph_li3"><a href="#">小小粒</a></li> 
 284:                              <li class="ph_li4"><a href="#">小小粒</a></li> 
 285:                              <li class="ph_li5"><a href="#">小小粒</a></li> 
 286:                          </ul> 
 287:                      </div> 
 288:                  </div> 
 289:                  <div class="question"> 
 290:                      <h3> 
 291:                          <p class="hide"> 
 292:                              參與調查</p> 
 293:                      </h3> 
 294:                      <table width="200"> 
 295:                          <tr> 
 296:                              <td colspan="2"> 
 297:                                  <b>Q.</b><span>您最喜歡以下哪種工藝品?</span> 
 298:                              </td> 
 299:                          </tr> 
 300:                          <tr> 
 301:                              <td> 
 302:                                  <input type="radio" /><span>泥塑</span> 
 303:                              </td> 
 304:                              <td> 
 305:                                  <input type="radio" /><span>木雕</span> 
 306:                              </td> 
 307:                          </tr> 
 308:                          <tr> 
 309:                              <td> 
 310:                                  <input type="radio" /><span>陶瓷</span> 
 311:                              </td> 
 312:                              <td> 
 313:                                  <input type="radio" /><span>石雕</span> 
 314:                              </td> 
 315:                          </tr> 
 316:                          <tr> 
 317:                              <td> 
 318:                                  <a href="#"> 
 319:                                      <img src='<%=ResolveUrl("images/sumbit.gif")%>' alt="提交" /></a> 
 320:                              </td> 
 321:                              <td> 
 322:                                  <a href="#"> 
 323:                                      <img src='<%=ResolveUrl("images/see.gif")%>' alt="查看結果" /></a> 
 324:                              </td> 
 325:                          </tr> 
 326:                      </table> 
 327:                  </div> 
 328:                  <div class="search"> 
 329:                      <div class="search_thing"> 
 330:                          <table width="225"> 
 331:                              <tr> 
 332:                                  <td height="25"> 
 333:                                      <select name="select" class="select"> 
 334:                                          <option>木雕</option> 
 335:                                          <option>泥塑</option> 
 336:                                          <option>陶瓷</option> 
 337:                                      </select> 
 338:                                  </td> 
 339:                                  <td height="25"> 
 340:                                      <input type="text" value="" /> 
 341:                                  </td> 
 342:                              </tr> 
 343:                              <tr> 
 344:                                  <td colspan="2"> 
 345:                                      <a href="#"> 
 346:                                          <img src='<%=ResolveUrl("images/search.png")%>' alt="搜索" /></a> 
 347:                                  </td> 
 348:                              </tr> 
 349:                              <tr> 
 350:                                  <td colspan="2" class="high_search"> 
 351:                                      <a href="search.html">前往高級搜索>></a> 
 352:                                  </td> 
 353:                              </tr> 
 354:                          </table> 
 355:                      </div> 
 356:                  </div> 
 357:              </div> 
 358:              <div class="right_side"> 
 359:                  <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"> 
 360:                  </asp:ContentPlaceHolder> 
 361:              </div> 
 362:              <div class="footer"> 
 363:                  <div class="s_nav"> 
 364:                      <ul> 
 365:                          <li><a href="#">在線留言</a>|</li> 
 366:                          <li><a href="#">聯系我們</a>|</li> 
 367:                          <li><a href="#">關於我們</a>|</li> 
 368:                          <li><a href="#">企業信息</a>|</li> 
 369:                          <li><a href="#">招商合作</a></li> 
 370:                      </ul> 
 371:                  </div> 
 372:                  <div class="foot"> 
 373:                      <p> 
 374:                          <span>廣東省潮州</span> <span>2011 © All RIGHTS RESERVED. [版權所有] 學生創新活動中心</span> 
 375:                      </p> 
 376:                      <p> 
 377:                          <span>制作與維護:計算機工程研發實驗室</span><span>聯系QQ群:73983871</span></p> 
 378:                  </div> 
 379:              </div> 
 380:          </div> 
 381:      </div> 
 382:  </body> 
 383:  </html> 
 384:   

接下來,后台相應請求:

   1:  <%@ WebHandler Language="C#" Class="GetMemberInfo" %>
   2:   
   3:  using System;
   4:   
   5:  using System.Web;
   6:   
   7:  using Common;
   8:   
   9:  using czcraft.Model;
  10:   
  11:  using czcraft.BLL;
  12:   
  13:  using System.Web.SessionState;
  14:   
  15:  public class GetMemberInfo : IHttpHandler, IRequiresSessionState
  16:   
  17:  {
  18:   
  19:  // //記錄日志
  20:   
  21:  private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
  22:   
  23:  public void ProcessRequest(HttpContext context)
  24:   
  25:  {
  26:   
  27:  String methodName = context.Request["method"];
  28:   
  29:  if (!string.IsNullOrEmpty(methodName))
  30:   
  31:  CallMethod(methodName, context);
  32:   
  33:  }
  34:   
  35:  /// <summary>
  36:   
  37:  /// 根據業務需求調用不同的方法
  38:   
  39:  /// </summary>
  40:   
  41:  /// <param name="Method">方法</param>
  42:   
  43:  /// <param name="context">上下文</param>
  44:   
  45:  public void CallMethod(string Method, HttpContext context)
  46:   
  47:  {
  48:   
  49:  switch (Method)
  50:   
  51:  {
  52:   
  53:  case "CheckExistUserName":
  54:   
  55:  CheckExistUserName(context);
  56:   
  57:  break;
  58:   
  59:  case "MemberLogin":
  60:   
  61:  MemberLogin(context);
  62:   
  63:  break;
  64:   
  65:  case "SaveMemberInfo":
  66:   
  67:  SaveMemberInfo(context);
  68:   
  69:  break;
  70:   
  71:  case "CheckLoginStatus":
  72:   
  73:  CheckLoginStatus(context);
  74:   
  75:  break;
  76:   
  77:  case "MemberLogout":
  78:   
  79:  MemberLogout(context);
  80:   
  81:  break;
  82:   
  83:  default:
  84:   
  85:  return;
  86:   
  87:  }
  88:   
  89:  }
  90:   
  91:  /// <summary>
  92:   
  93:  /// 退出
  94:   
  95:  /// </summary>
  96:   
  97:  /// <param name="context"></param>
  98:   
  99:  public void MemberLogout(HttpContext context)
 100:   
 101:  {
 102:   
 103:  string UserName = (string)context.Session["UserName"];
 104:   
 105:  memberBLL bll = new memberBLL();
 106:   
 107:  if (!Tools.IsNullOrEmpty(UserName))
 108:   
 109:  {
 110:   
 111:  //如果session存在,清除session
 112:   
 113:  context.Session.Remove("UserName");
 114:   
 115:  }
 116:   
 117:  //清除cookies
 118:   
 119:  CookieHelper.ClearCookie("UserName");
 120:   
 121:  CookieHelper.ClearCookie("Pwd");
 122:   
 123:  //頁面跳轉
 124:   
 125:  JScript.AlertAndRedirect("安全退出成功!歡迎下次前來訪問!", "http://www.cnblogs.com/Default.aspx");
 126:   
 127:  }
 128:   
 129:  /// <summary>
 130:   
 131:  /// 檢查用戶登錄狀態
 132:   
 133:  /// </summary>
 134:   
 135:  /// <param name="context"></param>
 136:   
 137:  public void CheckLoginStatus(HttpContext context)
 138:   
 139:  {
 140:   
 141:  string UserName = (string)context.Session["UserName"];
 142:   
 143:  memberBLL bll = new memberBLL();
 144:   
 145:  if (!Tools.IsNullOrEmpty(UserName))
 146:   
 147:  {
 148:   
 149:  //如果session存在,直接返回用戶狀態
 150:   
 151:  bll.WriteJsonForLogin(true, UserName);
 152:   
 153:  }
 154:   
 155:  else
 156:   
 157:  {
 158:   
 159:  //用戶自動登錄狀態檢測
 160:   
 161:  context.Response.Write(bll.CheckLoginStatus());
 162:   
 163:  }
 164:   
 165:  }
 166:   
 167:  /// <summary>
 168:   
 169:  /// 會員登錄
 170:   
 171:  /// </summary>
 172:   
 173:  /// <param name="context"></param>
 174:   
 175:  public void MemberLogin(HttpContext context)
 176:   
 177:  {
 178:   
 179:  try
 180:   
 181:  {
 182:   
 183:  //獲取數據
 184:   
 185:  string Name = context.Request["Name"];
 186:   
 187:  string Pwd = context.Request["Pwd"];
 188:   
 189:  string IsSaveName = context.Request["cbName"];
 190:   
 191:  string IsSavePwd = context.Request["cbPwd"];
 192:   
 193:  //用戶登錄狀態
 194:   
 195:  bool Status = false;
 196:   
 197:  //返回給客戶端的json數據
 198:   
 199:  string ReturnJson = "";
 200:   
 201:  //sql注入檢測
 202:   
 203:  if (Tools.IsValidInput(ref Name, true) && (Tools.IsValidInput(ref Pwd, true)) && (Tools.IsValidInput(ref IsSaveName, true)) && (Tools.IsValidInput(ref IsSavePwd, true)))
 204:   
 205:  {
 206:   
 207:  member info = new member();
 208:   
 209:  memberBLL bll = new memberBLL();
 210:   
 211:  info.username = Name;
 212:   
 213:  info.password = Pwd;
 214:   
 215:  ReturnJson = bll.ReturnJson(info, out Status);
 216:   
 217:  if (Status) //如果成功登陸
 218:   
 219:  {
 220:   
 221:  //記住帳號和密碼
 222:   
 223:  bll.RememberUserInfo(info, bll.GetRememberType(IsSaveName, IsSavePwd));
 224:   
 225:  //保存登錄狀態
 226:   
 227:  context.Session["UserName"] = info.username;
 228:   
 229:  }
 230:   
 231:  context.Response.Write(ReturnJson);
 232:   
 233:  }
 234:   
 235:  }
 236:   
 237:  catch (Exception ex)
 238:   
 239:  {
 240:   
 241:  logger.Error("會員登錄出錯!", ex);
 242:   
 243:  }
 244:   
 245:  }
 246:   
 247:  /// <summary>
 248:   
 249:  /// 驗證帳號是否存在
 250:   
 251:  /// </summary>
 252:   
 253:  /// <param name="context"></param>
 254:   
 255:  public void CheckExistUserName(HttpContext context)
 256:   
 257:  {
 258:   
 259:  string username = context.Request["username"];
 260:   
 261:  if (Tools.IsValidInput(ref username, true))
 262:   
 263:  {
 264:   
 265:  context.Response.Write(new memberBLL().CheckExistUserName(username));
 266:   
 267:  }
 268:   
 269:  }
 270:   
 271:  /// <summary>
 272:   
 273:  /// 保存用戶信息
 274:   
 275:  /// </summary>
 276:   
 277:  /// <param name="context"></param>
 278:   
 279:  public void SaveMemberInfo(HttpContext context)
 280:   
 281:  {
 282:   
 283:  try
 284:   
 285:  {
 286:   
 287:  //表單讀取
 288:   
 289:  string txtUserName = context.Request["txtUserName"];
 290:   
 291:  string txtPwd = context.Request["txtPwd"];
 292:   
 293:  string txtEmail = context.Request["txtEmail"];
 294:   
 295:  string txtCheckCode = context.Request["txtCheckCode"];
 296:   
 297:  //驗證碼校驗
 298:   
 299:  if (!txtCheckCode.Equals(context.Session["checkcode"].ToString()))
 300:   
 301:  {
 302:   
 303:  return;
 304:   
 305:  }
 306:   
 307:  //字符串sql注入檢測
 308:   
 309:  if (Tools.IsValidInput(ref txtUserName, true) && Tools.IsValidInput(ref txtPwd, true) && Tools.IsValidInput(ref txtEmail, true))
 310:   
 311:  {
 312:   
 313:  member info = new member();
 314:   
 315:  info.username = txtUserName;
 316:   
 317:  info.password = txtPwd;
 318:   
 319:  info.Email = txtEmail;
 320:   
 321:  info.states = "0";
 322:   
 323:  if (new memberBLL().AddNew(info) > 0)
 324:   
 325:  {
 326:   
 327:  SMTP smtp = new SMTP(info.Email);
 328:   
 329:  string webpath = context.Request.Url.Scheme + "://" + context.Request.Url.Authority + "/Default.aspx";
 330:   
 331:  smtp.Activation(webpath, info.username);//發送激活郵件
 332:   
 333:  JScript.AlertAndRedirect("注冊用戶成功!!", "../Default.aspx");
 334:   
 335:  }
 336:   
 337:  else
 338:   
 339:  {
 340:   
 341:  JScript.AlertAndRedirect("注冊用戶失敗!", "../Default.aspx");
 342:   
 343:  }
 344:   
 345:  }
 346:   
 347:  }
 348:   
 349:  catch (Exception ex)
 350:   
 351:  {
 352:   
 353:  logger.Error("錯誤!", ex);
 354:   
 355:  }
 356:   
 357:  }
 358:   
 359:  public bool IsReusable
 360:   
 361:  {
 362:   
 363:  get
 364:   
 365:  {
 366:   
 367:  return false;
 368:   
 369:  }
 370:   
 371:  }
 372:   
 373:  }
 374:   

業務邏輯BLL部分代碼:

   1:  /// <summary>
   2:   
   3:  /// 用戶登錄
   4:   
   5:  /// </summary>
   6:   
   7:  /// <param name="info">會員model</param>
   8:   
   9:  /// <returns></returns>
  10:   
  11:  public bool MemberLogin(member info)
  12:   
  13:  {
  14:   
  15:  return new memberDAL().MemberLogin(info);
  16:   
  17:  }
  18:   
  19:  /// <summary>
  20:   
  21:  /// 返回給客戶端的json格式數據(用於根據用戶登錄狀態決定)
  22:   
  23:  /// </summary>
  24:   
  25:  /// <param name="info"></param>
  26:   
  27:  /// <returns></returns>
  28:   
  29:  public string ReturnJson(member info, out bool Status)
  30:   
  31:  {
  32:   
  33:  //登錄狀態
  34:   
  35:  Status = MemberLogin(info);
  36:   
  37:  //生成json格式數據
  38:   
  39:  return WriteJsonForLogin(Status, info.username);
  40:   
  41:  }
  42:   
  43:  /// <summary>
  44:   
  45:  /// 記住帳號和密碼的枚舉
  46:   
  47:  /// </summary>
  48:   
  49:  public enum RememberType
  50:   
  51:  {
  52:   
  53:  /// <summary>
  54:   
  55:  /// 記住帳號
  56:   
  57:  /// </summary>
  58:   
  59:  RememberName = 0,
  60:   
  61:  /// <summary>
  62:   
  63:  /// 同時記住帳號和密碼
  64:   
  65:  /// </summary>
  66:   
  67:  RememberNameAndPwd = 1,
  68:   
  69:  /// <summary>
  70:   
  71:  /// 不記住帳號密碼
  72:   
  73:  /// </summary>
  74:   
  75:  NoRemember = 2
  76:   
  77:  }
  78:   
  79:  /// <summary>
  80:   
  81:  /// 根據保存帳號密碼狀態判斷是保存帳號還是同時保存帳號和密碼
  82:   
  83:  /// </summary>
  84:   
  85:  /// <param name="IsSaveName">"1"代表保存,"0"代表不保存</param>
  86:   
  87:  /// <param name="IsSavePwd">"1"代表保存,"0"代表不保存</param>
  88:   
  89:  /// <returns></returns>
  90:   
  91:  public RememberType GetRememberType(string IsSaveName, string IsSavePwd)
  92:   
  93:  {
  94:   
  95:  RememberType SaveType = RememberType.NoRemember;
  96:   
  97:  //保存帳號和密碼
  98:   
  99:  if (IsSaveName.Equals("1") && IsSavePwd.Equals("1"))
 100:   
 101:  {
 102:   
 103:  SaveType = RememberType.RememberNameAndPwd;
 104:   
 105:  }
 106:   
 107:  //保存帳號
 108:   
 109:  if (IsSaveName.Equals("1") && !IsSavePwd.Equals("1"))
 110:   
 111:  {
 112:   
 113:  SaveType = RememberType.RememberName;
 114:   
 115:  }
 116:   
 117:  else if(!IsSaveName.Equals("1"))
 118:   
 119:  {
 120:   
 121:  SaveType = RememberType.NoRemember;
 122:   
 123:  }
 124:   
 125:  return SaveType;
 126:   
 127:  }
 128:   
 129:  /// <summary>
 130:   
 131:  /// 檢查用戶登錄狀態,用於驗證自動登錄(並返回json格式)
 132:   
 133:  /// </summary>
 134:   
 135:  /// <returns></returns>
 136:   
 137:  public string CheckLoginStatus()
 138:   
 139:  {
 140:   
 141:  //登錄狀態
 142:   
 143:  bool Status = true;
 144:   
 145:  string UserName = Common.CookieHelper.GetCookieValue("UserName");
 146:   
 147:  //如果cookies為空,直接返回
 148:   
 149:  if (Tools.IsNullOrEmpty(UserName))
 150:   
 151:  {
 152:   
 153:  Status = false;
 154:   
 155:  }
 156:   
 157:  string Pwd = Common.CookieHelper.GetCookieValue("Pwd");
 158:   
 159:  if (Tools.IsNullOrEmpty(Pwd))
 160:   
 161:  {
 162:   
 163:  Status = false;
 164:   
 165:  }
 166:   
 167:  else
 168:   
 169:  {
 170:   
 171:  //查找該用戶真實密碼,並進行md5加密
 172:   
 173:  string password = Tools.GetMD5(new memberDAL().GetPassword(UserName));
 174:   
 175:  //如果兩次密碼相同則可以自動登陸了
 176:   
 177:  if (!password.Equals(Pwd))
 178:   
 179:  {
 180:   
 181:  Status = false;
 182:   
 183:  }
 184:   
 185:  }
 186:   
 187:  //生成json格式數據
 188:   
 189:  return WriteJsonForLogin(Status, UserName);
 190:   
 191:  }
 192:   
 193:  /// <summary>
 194:   
 195:  /// 為用戶登錄寫入json數據
 196:   
 197:  /// </summary>
 198:   
 199:  /// <param name="Status">登錄狀態</param>
 200:   
 201:  /// <param name="UserName">用戶名</param>
 202:   
 203:  /// <returns></returns>
 204:   
 205:  public string WriteJsonForLogin(bool Status, string UserName)
 206:   
 207:  {
 208:   
 209:  StringBuilder json = new StringBuilder();
 210:   
 211:  StringWriter sw = new StringWriter(json);
 212:   
 213:  using (JsonWriter jsonWriter = new JsonTextWriter(sw))
 214:   
 215:  {
 216:   
 217:  jsonWriter.Formatting = Formatting.Indented;
 218:   
 219:  jsonWriter.WriteStartObject();
 220:   
 221:  jsonWriter.WritePropertyName("Status");
 222:   
 223:  jsonWriter.WriteValue(Status);
 224:   
 225:  jsonWriter.WritePropertyName("UserName");
 226:   
 227:  jsonWriter.WriteValue(UserName);
 228:   
 229:  jsonWriter.WriteEndObject();
 230:   
 231:  }
 232:   
 233:  return json.ToString();
 234:   
 235:  }
 236:   
 237:  /// <summary>
 238:   
 239:  /// 記住用戶信息
 240:   
 241:  /// </summary>
 242:   
 243:  /// <param name="Type">記住用戶信息類別</param>
 244:   
 245:  /// <returns></returns>
 246:   
 247:  public bool RememberUserInfo(member info, RememberType type)
 248:   
 249:  {
 250:   
 251:  if (type == RememberType.RememberName)
 252:   
 253:  {
 254:   
 255:  //記住帳號7天
 256:   
 257:  CookieHelper.SetCookie("UserName", info.username, DateTime.Now.AddDays(7));
 258:   
 259:  }
 260:   
 261:  else if (type == RememberType.RememberNameAndPwd)
 262:   
 263:  {
 264:   
 265:  //md5哈希加密
 266:   
 267:  string sercret = Tools.GetMD5(info.password);
 268:   
 269:  //同時記住帳號和密碼7天
 270:   
 271:  CookieHelper.SetCookie("UserName", info.username, DateTime.Now.AddDays(7));
 272:   
 273:  CookieHelper.SetCookie("Pwd", sercret, DateTime.Now.AddDays(7));
 274:   
 275:  }
 276:   
 277:  else
 278:   
 279:  {
 280:   
 281:  return false;
 282:   
 283:  }
 284:   
 285:  return true;
 286:   
 287:  }

實現效果:

clip_image004

總結:

我們天天都在寫用戶登錄,但是考慮安全性,復用性,卻是非常少的,在這次實踐過程中,Switch語句,還是一個大問題,至今除了反射沒有太好的解決方法,正在考慮!

可以發現,這次的實現改進非常大,我清晰的記得去年實現這個功能的糟糕代碼, 太垃圾了,代碼凌亂呀……

代碼重質量,總結分析學習!

clip_image006


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM