您的位置:首页 > 博客中心 > 互联网 >

记录一次代码的重构优化

时间:2022-05-11 10:09

同事离职了,接手了他的代码。。

有客户反馈登录密码错误后被锁定不会解锁,或者错误一次就被锁定(???)。
不多比比,直接代码看看

//登陆失败次数
int FailedCount = 0;
if (null == Request.Cookies["FailedError"])
{
    HttpCookie failedCountCookie = new HttpCookie("FailedError");
    failedCountCookie["LoginCount"] = "0";
    failedCountCookie["LastLoginDate"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
    failedCountCookie.Expires = DateTime.Now.AddHours(1);
    Response.Cookies.Add(failedCountCookie);
}
else
{
    FailedCount = Convert.ToInt32(Request.Cookies["FailedError"]["LoginCount"]);
}
//如果当前时间与用户最后一次登陆时间差超过30分钟,则登陆失败次数自动清为0
if (Request.Cookies["FailedError"] != null)
{
    DateTime lastLoginDate = Convert.ToDateTime(Request.Cookies["FailedError"]["LastLoginDate"]);
    if (DateTime.Now.Subtract(lastLoginDate).Minutes > 30)
    {
        FailedCount = 0;
    }
}
//如果登陆次数超过5次,则锁定。等待1小时后才能登陆
if (FailedCount > 4)
{
    this.lblMsg.Text = "对不起,账号已经被锁定,请等待30分钟后重试.";
}
else
{
    this.lblMsg.Text = "";
    bool flag = false;
    string USERNAME = this.txtUSERNAME.Text;
    string PASSWORD = this.txtPASSWORD.Text;
    string ip = Request.UserHostAddress;
    string logmsg = "【" + USERNAME + "】于 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 登陆本系统, IP地址: " + Request.UserHostAddress + ", 登陆结果:";
    if (this.txtBox.Text.ToLower() == Session["checkcode"].ToString())
    {
        try
        {
            flag = bll.Exists(USERNAME);
            if (flag)
            {
                //PASSWORD = MethodHelper.EncrypToHashValue(PASSWORD);
                flag = bll.Exists(USERNAME, MethodHelper.EncrypToHashValue(PASSWORD));
                if (flag)
                {
                    logmsg += "成功";
                    Maticsoft.Model.USERS model = bll.GetModel(USERNAME);
                    if (model.LOGINIP == Request.UserHostAddress || (DateTime.Now - model.LOGINDATE).TotalSeconds > 1800)
                    {
                        Session["checkcode"] = null;//验证码使用后马上从服务器销毁
                        model.LOGINIP = Request.UserHostAddress;
                        model.LOGINDATE = DateTime.Now;
                        model.LOGINERRORCOUNT = 0;
                        bll.UpdateLoginInfo(model);
                        //LoginHelper.SetUser(model);
                    }
                    else
                    {
                        flag = false;
                        lblMsg.Text = " 登陆失败:用户已在其他地方登录。";
                        Session["checkcode"] = null;//验证码使用后马上从服务器销毁
                    }
                }
                else
                {
                    FailedCount++;
                    lblMsg.Text = " 登陆失败:用户名与密码不正确。";
                    Session["checkcode"] = null;//验证码使用后马上从服务器销毁
                    logmsg += "失败。试图登陆密码:" + txtPASSWORD.Text;
                }
            }
            else
            {
                FailedCount++;
                lblMsg.Text = "  登陆失败:用户名不正确。";
                Session["checkcode"] = null;//验证码使用后马上从服务器销毁
                logmsg += "失败。试图登陆密码:" + txtPASSWORD.Text;
            }
        }
        catch (Exception ex)
        {
            FailedCount++;
            lblMsg.Text = "  登陆异常: " + ex.Message;
            logmsg += "失败。异常信息: " + ex.Message;
            //Response.Redirect("~/login.aspx");
        }
        finally
        {
            Maticsoft.BLL.LOGGER.Add(USERNAME, logmsg);
        }
    }
    else if (Session["checkcode"] == null)
    {
        lblMsg.Text = "  验证码已过期,请重新输入。";
        return;
    }
    else
    {
        Session["checkcode"] = null;//验证码使用后马上从服务器销毁
        lblMsg.Text = "  登陆失败:验证码不通过。";
        return;
    }
    if (flag)
    {
        Response.Redirect("~/desk.aspx");
    }
    else
    {
        //更新登陆失败次数
        HttpCookie failedCountCookie = Request.Cookies["FailedError"];
        failedCountCookie["LoginCount"] = FailedCount.ToString();
        failedCountCookie["LastLoginDate"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        Response.Cookies.Add(failedCountCookie);
    }
}

额,看到代码的第一眼是有点崩溃的,这诡异的逻辑,还有这嵌套的ifelse,很难不让人气压飙升,得,我也懒得修了,直接重构一下得了。

基本的逻辑很简单,先判断下验证码能不能用,在判断下用户是否允许登录(是否被锁定、锁定用户是否达到解锁条件)就完事了

if (Session["checkcode"] == null)
{
    lblMsg.Text = "  验证码已过期,请重新获取。";
    return;
}
if (txtBox.Text.ToLower() != Session["checkcode"].ToString())
{
    lblMsg.Text = "  登陆失败:验证码不通过。";
    return;
}
Session["checkcode"] = null;//验证码使用后马上从服务器销毁
string USERNAME = txtUSERNAME.Text;
string PASSWORD = txtPASSWORD.Text;
UserService service = new UserService();
UserRequest userRequest = new UserRequest();
userRequest.UserName = USERNAME;
var result = service.GetUser(userRequest);
string logmsg = "【" + USERNAME + "】于 " + DateTime.Now.ToStrin("yyyy-MM-dd HH:mm:ss") + " 登陆本系统, IP地址: " + RequestUserHostAddress + ", 登陆结果:";
if (result.Count() == 0)
{
    lblMsg.Text = "  登陆失败:用户名不正确。";
    logmsg += "失败。试图登陆密码:" + txtPASSWORD.Text;
    return;
}
var user = result.First();
// 用户锁定,并且锁定时间未结束
if (user.LOGINERRORCOUNT >= 5 && (user.LOGINDATE.Value - DateTime.Now)TotalSeconds > 0)
{
    lblMsg.Text = string.Format("  登陆失败:用户名已锁定。剩余时间:{0}s", (int)(user.LOGINDATE.Value - DateTime.Now).TotalSeconds);
    return;
}
if (user.PASSWORD != MethodHelper.EncrypToHashValue(PASSWORD))
{
    lblMsg.Text = "  登陆失败:密码不正确。";
    logmsg += "失败。试图登陆密码:" + txtPASSWORD.Text;
    user.LOGINERRORCOUNT += 1;
    if (user.LOGINERRORCOUNT == 5)
        user.LOGINDATE = DateTime.Now.AddHours(1);
    service.UpdateErrorCount(user);
    return;
}
if (string.IsNullOrEmpty(user.LOGINIP) || 
    (user.LOGINIP.Trim() == Request.UserHostAddress || (DateTime.Now - user.LOGINDATE.Value).TotalSeconds > 1800))
{
    user.LOGINIP = Request.UserHostAddress;
    user.LOGINDATE = DateTime.Now;
    user.LOGINERRORCOUNT = 0;
    service.UpdateLoginInfo(user);
    LoginHelper.SetUser(user);
}
else
{
    lblMsg.Text = " 登陆失败:用户已在其他地方登录。";
    return;
}
Response.Redirect("~/desk.aspx");

本类排行

今日推荐

热门手游