一步步开发自己的博客 .NET版(3、注册登录功能)
<h1 id="autoid-0-0">前言?
所以打算写个系类:《》 ? ??演示地址:??? ? 群内共享源码: ? ? 今天主要来分析下注册和登录。关于这两个功能的实现我相信大家都有自己的经验,说容易可以做的很容易 说复杂可以做的很复杂。 ? ? 其实说白了,注册就是往数据库里面插入一条数据,登录就是查询数据库里面是否存在这条数据。当然,还可以有自己的规则验证。如:用户名不能重复,密码不能为空... ? ? 为了防止别人恶意注册 可以加个邮箱验证。那我们用什么邮箱发邮件通知呢,163 Mail ? QQ Mail ?,那我们做站长的 也忒掉面子了吧。起码也得来个和你域名相关的企业邮箱啊,是不?(*^__^*) ? ? 在这里我给大家分享一个免费的企业邮箱。?
? ? ? 关于免费的企业有申请,这里就不做过多介绍了,申请后绑定自己的域名就ok了。 ? ? ? 接下来,开始分析我的注册和登录功能的实现。 获取激活码和激活? ? ?这里首先说下获取激活码和激活处理。首先什么是激活码? 这里的激活码主要是用来验证。第一、证明邮箱用户确实存在,这样可以有效防止恶意注册。第二、只有邮箱用户才可以做用户信息修改处理,如 密码修改。因为需要用到激活码的地方“可能”比较多,所有 ? 我们把 这两个方法 分离出来。? ?? 获取激活码? ? 获取激活码,其实也就是 先生成一个随机数,先保存到Session,然后通过邮件发送到注册邮箱。当然 这里有个重要的地方,那就邮件的发送帮助类。 </span><span style="color: #0000ff;">#region</span> Eail 属性
<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">string</span> _mailFrom = <span style="color: #800000;">"</span><span style="color: #800000;">system@haojima.net</span><span style="color: #800000;">"</span><span style="color: #000000;">;
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 发送者
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> mailFrom { <span style="color: #0000ff;">get</span> { <span style="color: #0000ff;">return</span> _mailFrom; } <span style="color: #0000ff;">set</span> { _mailFrom =<span style="color: #000000;"> value; } }
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 收件人
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span>[] mailToArray { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 抄送
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span>[] mailCcArray { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 标题
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> mailSubject { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 正文
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> mailBody { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 发件人密码
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> mailPwd { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">string</span> _host = <span style="color: #800000;">"</span><span style="color: #800000;">smtp.haojima.net</span><span style="color: #800000;">"</span><span style="color: #000000;">;
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> SMTP邮件服务器
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> host { <span style="color: #0000ff;">get</span> { <span style="color: #0000ff;">return</span> _host; } <span style="color: #0000ff;">set</span> { _host =<span style="color: #000000;"> value; } }
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">bool</span> _isbodyHtml = <span style="color: #0000ff;">true</span><span style="color: #000000;">;
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 正文是否是html格式
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">bool</span> isbodyHtml { <span style="color: #0000ff;">get</span> { <span style="color: #0000ff;">return</span> _isbodyHtml; } <span style="color: #0000ff;">set</span> { _isbodyHtml =<span style="color: #000000;"> value; } }
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">string</span> _nickname = <span style="color: #800000;">"</span><span style="color: #800000;">嗨-博客 系统通知</span><span style="color: #800000;">"</span><span style="color: #000000;">;
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 发送者昵称
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span><span style="color: #000000;"> nickname
{
</span><span style="color: #0000ff;">get</span> { <span style="color: #0000ff;">return</span><span style="color: #000000;"> _nickname; }
</span><span style="color: #0000ff;">set</span><span style="color: #000000;">
{
_nickname </span>=<span style="color: #000000;"> value;
}
}
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 附件
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span>[] attachmentsPath { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
</span><span style="color: #008000;">//</span><span style="color: #008000;">优先级别</span>
<span style="color: #0000ff;">private</span> MailPriority _Priority =<span style="color: #000000;"> MailPriority.Normal;
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 优先级别 默认正常优先级
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span><span style="color: #000000;"> MailPriority Priority
{
</span><span style="color: #0000ff;">get</span><span style="color: #000000;">
{
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> _Priority;
}
</span><span style="color: #0000ff;">set</span><span style="color: #000000;">
{
_Priority </span>=<span style="color: #000000;"> value;
}
}
</span><span style="color: #0000ff;">#endregion</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">bool</span><span style="color: #000000;"> Send()
{
</span><span style="color: #008000;">//</span><span style="color: #008000;">使用指定的邮件地址初始化MailAddress实例</span>
MailAddress maddr = <span style="color: #0000ff;">new</span><span style="color: #000000;"> MailAddress(mailFrom,nickname);
</span><span style="color: #008000;">//</span><span style="color: #008000;">初始化MailMessage实例</span>
MailMessage myMail = <span style="color: #0000ff;">new</span><span style="color: #000000;"> MailMessage();
</span><span style="color: #008000;">//</span><span style="color: #008000;">向收件人地址集合添加邮件地址</span>
<span style="color: #0000ff;">if</span> (mailToArray != <span style="color: #0000ff;">null</span><span style="color: #000000;">)
{
</span><span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = <span style="color: #800080;">0</span>; i < mailToArray.Length; i++<span style="color: #000000;">)
{
myMail.To.Add(mailToArray[i].ToString());
}
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">向抄送收件人地址集合添加邮件地址</span>
<span style="color: #0000ff;">if</span> (mailCcArray != <span style="color: #0000ff;">null</span><span style="color: #000000;">)
{
</span><span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = <span style="color: #800080;">0</span>; i < mailCcArray.Length; i++<span style="color: #000000;">)
{
myMail.CC.Add(mailCcArray[i].ToString());
}
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">发件人地址</span>
myMail.From =<span style="color: #000000;"> maddr;
</span><span style="color: #008000;">//</span><span style="color: #008000;">电子邮件的标题</span>
myMail.Subject =<span style="color: #000000;"> mailSubject;
</span><span style="color: #008000;">//</span><span style="color: #008000;">电子邮件的主题内容使用的编码</span>
myMail.SubjectEncoding =<span style="color: #000000;"> Encoding.UTF8;
</span><span style="color: #008000;">//</span><span style="color: #008000;">电子邮件正文</span>
myMail.Body =<span style="color: #000000;"> mailBody;
</span><span style="color: #008000;">//</span><span style="color: #008000;">电子邮件正文的编码</span>
myMail.BodyEncoding =<span style="color: #000000;"> Encoding.Default;
</span><span style="color: #008000;">//</span><span style="color: #008000;">邮件优先级</span>
myMail.Priority =<span style="color: #000000;"> Priority;
myMail.IsBodyHtml </span>=<span style="color: #000000;"> isbodyHtml;
</span><span style="color: #008000;">//</span><span style="color: #008000;">在有附件的情况下添加附件</span>
<span style="color: #0000ff;">try</span><span style="color: #000000;">
{
</span><span style="color: #0000ff;">if</span> (attachmentsPath != <span style="color: #0000ff;">null</span> && attachmentsPath.Length > <span style="color: #800080;">0</span><span style="color: #000000;">)
{
Attachment attachFile </span>= <span style="color: #0000ff;">null</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">foreach</span> (<span style="color: #0000ff;">string</span> path <span style="color: #0000ff;">in</span><span style="color: #000000;"> attachmentsPath)
{
attachFile </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Attachment(path);
myMail.Attachments.Add(attachFile);
}
}
}
</span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception err)
{
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> Exception(<span style="color: #800000;">"</span><span style="color: #800000;">在添加附件时有错误:</span><span style="color: #800000;">"</span> +<span style="color: #000000;"> err);
}
SmtpClient smtp </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> SmtpClient();
</span><span style="color: #008000;">//</span><span style="color: #008000;">指定发件人的邮件地址和密码以验证发件人身份</span>
smtp.Credentials = <span style="color: #0000ff;">new</span> System.Net.NetworkCredential(mailFrom,mailPwd);<span style="color: #008000;">//</span><span style="color: #008000;">115 </span><span style="color: #008000;">//</span><span style="color: #008000;">设置SMTP邮件服务器</span>
smtp.Host =<span style="color: #000000;"> host;
</span><span style="color: #008000;">//</span><span style="color: #008000;"> smtp.EnableSsl = true;
</span><span style="color: #008000;">//</span><span style="color: #008000;">smtp.Port = 587;</span>
<span style="color: #0000ff;">try</span><span style="color: #000000;">
{
</span><span style="color: #008000;">//</span><span style="color: #008000;">将邮件发送到SMTP邮件服务器</span>
<span style="color: #000000;"> smtp.Send(myMail);
? ? 用法: EmailHelper email = ======
效果图: 激活? ? ? 激活,复制你邮件收到的激活码 和 session 里面保存的数据数 ?比较。如果 相等 则表示验证成功。然后,该注册 的注册 、该改密码的改密码。(验证成功后 可以发个邮件告知 注册成功 并发送注册信息 以免 注册用户 忘记 注销信息) 数据验证? ? ? 在注册和登录的过程中,有多处地方需要验证。如:用户名密码 必填非空 邮箱格式比较正确。然而,在MVC里的特性验证用起来 那个爽歪歪的。 ? ? ? 这里来说说我的用法()。 ? ? ? 特性验证:?Required 非空? UserName { ; ; }? ? ? ? 我们直接把特性标识在属性的上面就可以了,如果在数据保存的时候 验证不通过 则会抛出自定义的 异常信息。不过这里有个问题,我们的实体类都是通过 tt 文件自动生成的。我们加上去的特性 在下次保存 tt 文件的时候 又会清空。不过微软的猿们 早就替我们想好了。tt 生成的是部分类。那么 我们也就可以在外部生成 一个部分类来 加特性 然后在编译的时候 自动合并。? ? ? ?这里是后台验证。当然 我们不能只仅仅验证后台,要是能直接在前台就能 屏蔽 验证不通过的请求 也能减轻服务器的 负担。接下来要说的 就是 “爽歪歪”的。我们在后台加的特性验证,可以直接在前台也做验证。好神奇,这是怎么实现的呢?其实我们看看生成的html代码 就大概会猜到了。 ? ? ?首先 我们在View 的?Razor视图?使用的强类型的“声明”。?? ? ? ?然后 在View的使用?? t.UserName) ? ?可以直接使用拉姆达表达式 爽啊。 ? ? ?我们可以看到前台生成的html代码? = data-val= data-val-required= id= name= type= value=>?
? ? ?看到这里 我们是不是已经明白了点什么呢? 验证信息 直接带到了 标签里面。当然 ? 这仅仅只是生成在了html标签里面。其实 ?我们现在还不能完成前台的验证。我们要真的能自动在前台验证的话?? 需要引入一些 微软 提供的js文件。??? 看名字就知道 ? 引用之前 还需引用jquery 文件。 ? ? 在此 前台验证 效果已经ok了。那仅仅 验证了 也还是不够的。起码也得有个 提示信息吧。? t.UserName)?自动输出 验证不通过的 信息提示。 ? ? 总结下使用MVC中的 特性来验证: ? ? 第一、需要在后台的模型类 里面加上特性:如? UserName { ; ; }? (这里仅仅完成了后台验证) ? ? 第二、需要在前台引入两个js文件??(这里完成了前台验证) ? ? 第三、在View文件中 生成控件 和验证提示信息。? t.UserName) @Html.ValidationMessageFor(t => t.UserName)? ? ? 效果图: ? ? 演示地址:? ? ? ? 注册和登录中最重要的 获取激活码、激活和数据验证都已经分析完了,那么下面就简单的说下注册、登录和重置密码吧。 注册? ? ?首先关于注册信息包含:用户名、密码、昵称、邮箱。 ? ? ?用户名:必填非空非重复,主要用来验证登录 和url中的链接。如:? ?中的?zhaopei。 ? ? ?密码:必填非空,主要用来验证登录。 ? ? ?昵称:非必填,主要用来友好显示在你的个人主页、方便别人记住你。如果是空,则用 用户名替代。 ? ? ?邮箱:必填非空非重复,主要用来 注册的时候验证激活、重置密码的时候验证激活 和 评论邮件通知、站内消息通知(评论邮件通知 站内消息通知 功能暂未完成)? ? ? ? ?效果图: 登录? ? ?1.如果登录成功。保存登录用户信息到session。 ? ? ?2.如果勾选了“自动登录” 则保存 用户信息到 客户端 cookie,下次取session 时如果 session 为null ?在看cookie是否有 有效用户信息。 ? ? ?在这里 我还在数据库里面 加了个 “IsLock” 是否被锁定。如果 检测到 发布恶意 ?或违法内容 可以用来 锁定用户。使之不能登录。 ? ? ?效果图: 重置密码? ? ? 重置密码,也就是修改密码。 ? ? ? 需要用到的字段:邮箱、新密码 ? ? ? 发送验证码到邮箱,然后判断输入的验证码是否正确。如果正确 则把密码修改成新密码。 ? ? ? 效果图: 总结? ? ? ? 这里主要是分析介绍了下 博客用户的 注册、登录和密码重置。其主要的共用模块功能有 获取激活码、触发激活 和 数据验证。 ? ? ? ? 注册流程:填写注册信息-> 验证信息-> 邮件验证-> 注册成功 ? ? ? ? 登录流程:填写登录信息-> 数据库查询->? ? ? ? ? ? ? ? ? ? ? ? 1.锁定-> 发送邮箱激活码-> 激活 ->登录成功 ? ? ? ? ? ? ? ? ? ? ? 2.未锁定->登录成功
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 如何从对象HtmlAttributes中获取值
- asp.net-mvc – 断言操作重定向到正确的操作/路由?
- asp.net-mvc – Nullable DateTime在调用操作时从不绑定参数
- 将ASP.NET引入Thinking Request是Ajax请求jQuery文件上传
- JS-面向对象编程-对象方法添加属性
- asp.net-mvc – 存在多个获取操作时的MVC API路由
- asp.net-mvc – 使用DI和不使用EF实现工作单元
- Asp.net形成认证cookie,不符合IIS7超时
- asp.net – ISNULL与SQL Server 2008
- asp.net-mvc-4 – 如何输出Request.CreateResponse方法的js
- asp.net – 静态方法的缺点是什么?
- asp.net-mvc-3 – 使用MVC 3的Knockout java脚本
- asp.net – 在什么情况下,.NET进程和AppDomains在
- 剃刀 – 我应该在ASP.NET MVC 3中放置声明式HTML
- asp.net-mvc-3 – 实体框架检测到冲突的更改.尝试
- 强制其他用户使用ASP.NET Identity 2.1.0刷新其声
- 当空的asp.net时,ListView LayoutTemplate不显示
- asp.net – CookieContainer和Response.Cookies集
- asp.net-mvc – Asp.Net MVC Razor FileUpload H
- ASP.NET Core在Azure Kubernetes Service中的部署