栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > asp

一步一步学asp.net Ajax登录设计实现解析

asp 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一步一步学asp.net Ajax登录设计实现解析

任务需求:做一个登录,拥有自动记住账号和密码的功能,要保证安全性,ajax,无刷新,良好的用户体验.(母板页)

这是前台页面,要求实现用户登录

首先我们分析,

用户需求:

1. 登录以后,登录框隐藏,并且欢迎登录的框显示,并且,左上角登录的按钮消失,安全退出显示.

2. 如果选择记住帐号和密码,下次登录直接登录,并且保证安全性.

实现过程:

首先,登录的时候发出ajax请求,用户验证登录,登录以后,保存当前用户名和密码到cookies中,注意,密码要用md5加密,md5是根据用户的机器配置生成的,并且返回登录状态和用户名的json数据

第二次登录的时候,检测用户状态,如果用户cookies保存的用户名和密码,根据用户名读取用户密码,并进行md5加密,检验两次密码是否相同,如果相同就返回json数据,登录状态true和用户名,如果cookies中只有用户名,那么返回登录状态为false和用户名

前台主要代码:
复制代码 代码如下:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Left_Top_Dwon.master.cs"
Inherits="Left_Top_Dwon" %>




无标题文档














  • 登录 |

  • 注册

  • |个人信息

  • |我的收藏夹

  • |我的留言

  • |总站留言

  • |'>安全退出





  • 首  页

  • 工艺概况

  • 工艺知识

    大吴泥塑 金漆木雕 潮州刺绣 潮州陶瓷


  • 作品展览

  • 非遗作品

  • 新闻中心

    大吴泥塑 金漆木雕 潮州刺绣 潮州陶瓷


  • 大师风采

  • 企业展示

  • 联系我们









' alt="大师入口" title="大师入口" />


' alt="企业入口" title="企业入口" />



推荐排行榜



更多




  • 大师推荐

  • 工艺品推荐

  • 企业推荐




  • 周少君

  • 周少君

  • 周少君

  • 周少君

  • 周少君



  • 大大个

  • 大大个

  • 大大个

  • 大大个

  • 大大个



  • 小小粒

  • 小小粒

  • 小小粒

  • 小小粒

  • 小小粒







参与调查




















Q.您最喜欢以下哪种工艺品?

泥塑

木雕

陶瓷

石雕


' alt="提交" />


' alt="查看结果" />





















' alt="搜索" />











  • 在线留言|

  • 联系我们|

  • 关于我们|

  • 企业信息|

  • 招商合作





广东省潮州 2011 © All RIGHTS RESERVED. [版权所有] 学生创新活动中心



制作与维护:计算机工程研发实验室联系QQ群:73983871









接下来,后台相应请求:
复制代码 代码如下:
<%@ WebHandler Language="C#" Class="GetMemberInfo" %>
using System;
using System.Web;
using Common;
using czcraft.Model;
using czcraft.BLL;
using System.Web.SessionState;
public class GetMemberInfo : IHttpHandler, IRequiresSessionState
{
// //记录日志
private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.Methodbase.GetCurrentMethod().DeclaringType);
public void ProcessRequest(HttpContext context)
{
String methodName = context.Request["method"];
if (!string.IsNullOrEmpty(methodName))
CallMethod(methodName, context);
}
///
/// 根据业务需求调用不同的方法
///

/// 方法
/// 上下文
public void CallMethod(string Method, HttpContext context)
{
switch (Method)
{
case "CheckExistUserName":
CheckExistUserName(context);
break;
case "MemberLogin":
MemberLogin(context);
break;
case "SaveMemberInfo":
SaveMemberInfo(context);
break;
case "CheckLoginStatus":
CheckLoginStatus(context);
break;
case "MemberLogout":
MemberLogout(context);
break;
default:
return;
}
}
///
/// 退出
///

///
public void MemberLogout(HttpContext context)
{
string UserName = (string)context.Session["UserName"];
memberBLL bll = new memberBLL();
if (!Tools.IsNullOrEmpty(UserName))
{
//如果session存在,清除session
context.Session.Remove("UserName");
}
//清除cookies
cookieHelper.Clearcookie("UserName");
cookieHelper.Clearcookie("Pwd");
//页面跳转
Jscript.alertAndRedirect("安全退出成功!欢迎下次前来访问!", "http://www.cnblogs.com/Default.aspx");
}
///
/// 检查用户登录状态
///

///
public void CheckLoginStatus(HttpContext context)
{
string UserName = (string)context.Session["UserName"];
memberBLL bll = new memberBLL();
if (!Tools.IsNullOrEmpty(UserName))
{
//如果session存在,直接返回用户状态
bll.WriteJsonForLogin(true, UserName);
}
else
{
//用户自动登录状态检测
context.Response.Write(bll.CheckLoginStatus());
}
}
///
/// 会员登录
///

///
public void MemberLogin(HttpContext context)
{
try
{
//获取数据
string Name = context.Request["Name"];
string Pwd = context.Request["Pwd"];
string IsSaveName = context.Request["cbName"];
string IsSavePwd = context.Request["cbPwd"];
//用户登录状态
bool Status = false;
//返回给客户端的json数据
string ReturnJson = "";
//sql注入检测
if (Tools.IsValidInput(ref Name, true) && (Tools.IsValidInput(ref Pwd, true)) && (Tools.IsValidInput(ref IsSaveName, true)) && (Tools.IsValidInput(ref IsSavePwd, true)))
{
member info = new member();
memberBLL bll = new memberBLL();
info.username = Name;
info.password = Pwd;
ReturnJson = bll.ReturnJson(info, out Status);
if (Status) //如果成功登陆
{
//记住帐号和密码
bll.RememberUserInfo(info, bll.GetRememberType(IsSaveName, IsSavePwd));
//保存登录状态
context.Session["UserName"] = info.username;
}
context.Response.Write(ReturnJson);
}
}
catch (Exception ex)
{
logger.Error("会员登录出错!", ex);
}
}
///
/// 验证帐号是否存在
///

///
public void CheckExistUserName(HttpContext context)
{
string username = context.Request["username"];
if (Tools.IsValidInput(ref username, true))
{
context.Response.Write(new memberBLL().CheckExistUserName(username));
}
}
///
/// 保存用户信息
///

///
public void SaveMemberInfo(HttpContext context)
{
try
{
//表单读取
string txtUserName = context.Request["txtUserName"];
string txtPwd = context.Request["txtPwd"];
string txtEmail = context.Request["txtEmail"];
string txtCheckCode = context.Request["txtCheckCode"];
//验证码校验
if (!txtCheckCode.Equals(context.Session["checkcode"].ToString()))
{
return;
}
//字符串sql注入检测
if (Tools.IsValidInput(ref txtUserName, true) && Tools.IsValidInput(ref txtPwd, true) && Tools.IsValidInput(ref txtEmail, true))
{
member info = new member();
info.username = txtUserName;
info.password = txtPwd;
info.Email = txtEmail;
info.states = "0";
if (new memberBLL().AddNew(info) > 0)
{
SMTP smtp = new SMTP(info.Email);
string webpath = context.Request.Url.Scheme + "://" + context.Request.Url.Authority + "/Default.aspx";
smtp.Activation(webpath, info.username);//发送激活邮件
Jscript.alertAndRedirect("注册用户成功!!", "../Default.aspx");
}
else
{
Jscript.alertAndRedirect("注册用户失败!", "../Default.aspx");
}
}
}
catch (Exception ex)
{
logger.Error("错误!", ex);
}
}
public bool IsReusable
{
get
{
return false;
}
}
}

业务逻辑BLL部分代码:
复制代码 代码如下:
///
/// 用户登录
///

/// 会员model
///
public bool MemberLogin(member info)
{
return new memberDAL().MemberLogin(info);
}
///
/// 返回给客户端的json格式数据(用于根据用户登录状态决定)
///

///
///
public string ReturnJson(member info, out bool Status)
{
//登录状态
Status = MemberLogin(info);
//生成json格式数据
return WriteJsonForLogin(Status, info.username);
}
///
/// 记住帐号和密码的枚举
///

public enum RememberType
{
///
/// 记住帐号
///

RememberName = 0,
///
/// 同时记住帐号和密码
///

RememberNameAndPwd = 1,
///
/// 不记住帐号密码
///

NoRemember = 2
}
///
/// 根据保存帐号密码状态判断是保存帐号还是同时保存帐号和密码
///

/// "1"代表保存,"0"代表不保存
/// "1"代表保存,"0"代表不保存
///
public RememberType GetRememberType(string IsSaveName, string IsSavePwd)
{
RememberType SaveType = RememberType.NoRemember;
//保存帐号和密码
if (IsSaveName.Equals("1") && IsSavePwd.Equals("1"))
{
SaveType = RememberType.RememberNameAndPwd;
}
//保存帐号
if (IsSaveName.Equals("1") && !IsSavePwd.Equals("1"))
{
SaveType = RememberType.RememberName;
}
else if(!IsSaveName.Equals("1"))
{
SaveType = RememberType.NoRemember;
}
return SaveType;
}
///
/// 检查用户登录状态,用于验证自动登录(并返回json格式)
///

///
public string CheckLoginStatus()
{
//登录状态
bool Status = true;
string UserName = Common.cookieHelper.Getcookievalue("UserName");
//如果cookies为空,直接返回
if (Tools.IsNullOrEmpty(UserName))
{
Status = false;
}
string Pwd = Common.cookieHelper.Getcookievalue("Pwd");
if (Tools.IsNullOrEmpty(Pwd))
{
Status = false;
}
else
{
//查找该用户真实密码,并进行md5加密
string password = Tools.GetMD5(new memberDAL().GetPassword(UserName));
//如果两次密码相同则可以自动登陆了
if (!password.Equals(Pwd))
{
Status = false;
}
}
//生成json格式数据
return WriteJsonForLogin(Status, UserName);
}
///
/// 为用户登录写入json数据
///

/// 登录状态
/// 用户名
///
public string WriteJsonForLogin(bool Status, string UserName)
{
StringBuilder json = new StringBuilder();
StringWriter sw = new StringWriter(json);
using (JsonWriter jsonWriter = new JsonTextWriter(sw))
{
jsonWriter.Formatting = Formatting.Indented;
jsonWriter.WriteStartObject();
jsonWriter.WritePropertyName("Status");
jsonWriter.Writevalue(Status);
jsonWriter.WritePropertyName("UserName");
jsonWriter.Writevalue(UserName);
jsonWriter.WriteEndObject();
}
return json.ToString();
}
///
/// 记住用户信息
///

/// 记住用户信息类别
///
public bool RememberUserInfo(member info, RememberType type)
{
if (type == RememberType.RememberName)
{
//记住帐号7天
cookieHelper.Setcookie("UserName", info.username, DateTime.Now.AddDays(7));
}
else if (type == RememberType.RememberNameAndPwd)
{
//md5哈希加密
string sercret = Tools.GetMD5(info.password);
//同时记住帐号和密码7天
cookieHelper.Setcookie("UserName", info.username, DateTime.Now.AddDays(7));
cookieHelper.Setcookie("Pwd", sercret, DateTime.Now.AddDays(7));
}
else
{
return false;
}
return true;
}

实现效果:


总结:
我们天天都在写用户登录,但是考虑安全性,复用性,却是非常少的,在这次实践过程中,Switch语句,还是一个大问题,至今除了反射没有太好的解决方法,正在考虑!
可以发现,这次的实现改进非常大,我清晰的记得去年实现这个功能的糟糕代码, 太垃圾了,代码凌乱呀……
代码重质量,总结分析学习!

作者 cnblogs tianzh
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/58383.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号