一步一步学asp.net_Ajax登录设计

来源:岁月联盟 编辑:exp 时间:2012-04-25

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.2cto.com ");
 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

 

一直在努力,从未曾放弃,努力学习中..... 欢迎一起学习.net!

 


作者  TZHSWEET