【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.5) 登录功能的实现,完善登录功能...

索引

【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目 目录索引

简述

今天我们来完善我们的登录功能

项目准备

我们用的工具是:VS 2013 + SqlServer 2012 + IIS7.5

希望大家对ASP.NET MVC有一个初步的理解,理论性的东西我们不做过多解释,有些地方不理解也没关系,会用就行了,用的多了,用的久了,自然就理解了。

项目开始

一、我们先来丰富一下登录页面

我随便从网上Down了个登录页,大家可以套上自己的登录页,我们前面做了个简单的登录页,只有用户名和密码,现在我们增加一个验证码

首先,我们新建个验证码的类 verify_code.cs  我们就建在 Models文件夹下面吧

相信很多朋友都有验证码的生成类,这里只给新手朋友提供一下参考

验证码生成类

  1 using System.Drawing.Imaging;
  2 using System.IO;
  3 using System.Linq;
  4 using System.Web;
  5 
  6 namespace Models
  7 {
  8     /// <summary>
  9     /// 验证码构造类
 10     /// add yuangang by 2015-05-10
 11     /// </summary>
 12     public class verify_code
 13     {
 14         /// <summary>  
 15         /// 该方法用于生成指定位数的随机数  
 16         /// </summary>  
 17         /// <param name="VcodeNum">参数是随机数的位数</param>  
 18         /// <returns>返回一个随机数字符串</returns>  
 19         private string RndNum(int VcodeNum)
 20         {
 21             //验证码可以显示的字符集合  
 22             string Vchar = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,p" +
 23                 ",q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,P,Q" +
 24                 ",R,S,T,U,V,W,X,Y,Z";
 25             string[] VcArray = Vchar.Split(new Char[] { ',' });//拆分成数组  
 26             string VNum = "";//产生的随机数  
 27             int temp = -1;//记录上次随机数值,尽量避避免生产几个一样的随机数  
 28 
 29             Random rand = new Random();
 30             //采用一个简单的算法以保证生成随机数的不同  
 31             for (int i = 1; i < VcodeNum + 1; i++)
 32             {
 33                 if (temp != -1)
 34                 {
 35                     rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));//初始化随机类  
 36                 }
 37                 int t = rand.Next(61);//获取随机数  
 38                 if (temp != -1 && temp == t)
 39                 {
 40                     return RndNum(VcodeNum);//如果获取的随机数重复,则递归调用  
 41                 }
 42                 temp = t;//把本次产生的随机数记录起来  
 43                 VNum += VcArray[t];//随机数的位数加一  
 44             }
 45             return VNum;
 46         }
 47 
 48         /// <summary>  
 49         /// 该方法是将生成的随机数写入图像文件  
 50         /// </summary>  
 51         /// <param name="VNum">VNum是一个随机数</param>  
 52         public MemoryStream Create(out string VNum)
 53         {
 54             VNum = RndNum(4);
 55             Bitmap Img = null;
 56             Graphics g = null;
 57             MemoryStream ms = null;
 58             System.Random random = new Random();
 59             //验证码颜色集合  
 60             Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
 61             //验证码字体集合  
 62             string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
 63 
 64 
 65             //定义图像的大小,生成图像的实例  
 66             Img = new Bitmap((int)VNum.Length * 18, 32);
 67 
 68             g = Graphics.FromImage(Img);//从Img对象生成新的Graphics对象    
 69 
 70             g.Clear(Color.White);//背景设为白色  
 71 
 72             //在随机位置画背景点  
 73             for (int i = 0; i < 100; i++)
 74             {
 75                 int x = random.Next(Img.Width);
 76                 int y = random.Next(Img.Height);
 77                 g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);
 78             }
 79             //验证码绘制在g中  
 80             for (int i = 0; i < VNum.Length; i++)
 81             {
 82                 int cindex = random.Next(7);//随机颜色索引值  
 83                 int findex = random.Next(5);//随机字体索引值  
 84                 Font f = new System.Drawing.Font(fonts[findex], 15, System.Drawing.FontStyle.Bold);//字体  
 85                 Brush b = new System.Drawing.SolidBrush(c[cindex]);//颜色  
 86                 int ii = 4;
 87                 if ((i + 1) % 2 == 0)//控制验证码不在同一高度  
 88                 {
 89                     ii = 2;
 90                 }
 91                 g.DrawString(VNum.Substring(i, 1), f, b, 3 + (i * 12), ii);//绘制一个验证字符  
 92             }
 93             ms = new MemoryStream();//生成内存流对象  
 94             Img.Save(ms, ImageFormat.Jpeg);//将此图像以Png图像文件的格式保存到流中  
 95 
 96             //回收资源  
 97             g.Dispose();
 98             Img.Dispose();
 99             return ms;
100         }
101     }
102 }
View Code

好,我们在AccountController.cs下面新建一个生成图片的二进制图片

好了,我们可以在登录页面插入这个图片

带验证码的完整的 登录页面表单就好了

 

二、我们增加验证码的功能

首先我们获取一下表单验证码

然后我们应该先判断一下 我们的验证码图片是否过期 即 Session存储的验证码 是否存在

我们在 Session存储的验证码没有过期 即 Session["gif"] != null 里面判断一下用户输入的验证码是否正确

我们把我们的登录验证 方法 放到 用户验证码输入正确的方法体里面(如果用户输入的验证码不正确,我们就没有必要验证用户信息了)

 

三、我们修改一下我们的验证方法

验证码没有过期,用户输入的验证码正确,这种情况下我们就应该验证用户信息了,前几篇我们已经写过验证功能了,我们来修改完善一下

上一篇,我们验证用户信息真实的情况下,我们直接通过Json输出了 Status="y",但是我们并没有存储用户信息,今天我们来修改一下这个方法存储用户信息,我们通过两种方式,首先通过Session存储用户信息,然后把用户非关键信息加密后写入Cookies,当Session过期的时候,我们就通过Cookies重新获取用户并存储用户信息,这是大致的流程 很多朋友会说这也不是很安全,是的,没有绝对的安全,软件是没有绝对的100%安全的,我们只能在我们需求的情况下做到自己最好的安全。

我们在前一章写了个用户类Account 描述用户的详细信息,包括部门、权限、岗位、角色等 我们通过用户基础表 来获取一下这些信息

var acconut = this.UserManage.GetAccountByUser(users);

写入当前用户到Session中

1 //写入Session 当前登录用户
2 SessionHelper.SetSession("CurrentUser", acconut);

记录用户ID、登录名、密码 到Cookies

1 //记录用户信息到Cookies
2  string cookievalue = "{\"id\":\"" + acconut.Id + "\",\"username\":\"" + acconut.LogName +
3                                                  "\",\"password\":\"" + acconut.PassWord + "\",\"ToKen\":\"" +
4                                                  Session.SessionID + "\"}";
5  CookieHelper.SetCookie("cookie_rememberme", new Common.CryptHelper.AESCrypt().Encrypt(cookievalue),null);

我们更新一下用户本次登录的IP

1  //更新用户本次登录IP
2  users.LastLoginIP = Utils.GetIP();
3  UserManage.Update(users);

如果验证成功,我们跳转到我们的管理中心首页 

json.ReUrl = "/Sys/Home/Index";

这样,我们的登录就OK了

 

OK,下一篇我们来做权限~~~

 

 

原创文章 转载请尊重劳动成果 http://yuangang.cnblogs.com

 

转载于:https://www.cnblogs.com/yuangang/p/5522700.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jsonobject转list集合_怎样优雅的操作集合,CollectionUtils工具类正确使用姿势

点击上方"码之初"关注&#xff0c;选择"设为星标"与精品技术文章不期而遇来源&#xff1a;cnblogs.com/qdhxhz/p/10787130.html这篇讲的CollectionUtils工具类是在apache下的, 而不是springframework下的CollectionUtils。个人觉得CollectionUtils在真实项…

docx命令运行Java_使用Java将DOC文件转换为DOCX

7 个答案:答案 0 :(得分&#xff1a;3)// Open a document.Document doc new Document("input.doc");// Save document.doc.save("output.docx");请查看这在您的方案中是否有帮助。披露&#xff1a;我在Aspose担任开发人员传播者。答案 1 :(得分&#xff…

[c#基础]使用抽象工厂实现三层

引言 昨天加了一天班&#xff0c;今天闲来无事&#xff0c;就在想如何将之前的三层和最近一直在学的设计模式给联系在一起&#xff0c;然后就动手弄了个下面的小demo。 项目结构 项目各个层实现 Wolfy.Model层中有一个抽象类BaseModel.cs&#xff0c;User.cs是用户实体类&#…

php 当前ip_php获取本机ip(远程IP地址)

例子&#xff0c;php获取用户IP地址。复制代码 代码示例:// 111111111111echo $_SERVER[REMOTE_ADDR];// 2222222222222function get_local_ip() {$preg "/\A((([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\.){3}(([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25…

场效应管原理_场效应管——不就是一个电控开关?

管在mpn中&#xff0c;它的长相和我们常面讲的三极管非常像&#xff0c;所以有不少修朋友好长时间还分不清楚&#xff0c;统一的把这些长相相同的三极管、场效应管、双二极管、还有各种稳压IC统统称作“三个脚的管管”&#xff0c;呵呵&#xff0c;如果这样麻木不分的话&#x…

解决phpMyAdmin在nginx+php-fpm模式下无法使用的问题

原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dgd2010.blog.51cto.com/1539422/1684839 昨天接到一个网友的问题&#xff0c;说yum安装nginxphp-fpmmysqlphpMyAdmin后&#xff0c;发现…

python库有什么用_Python程序员必知什么 常用的Python库有哪些

Python程序员必知什么&#xff1f;常用的Python库有哪些&#xff1f;Python有很多丰富而强大的库&#xff0c;这是它成为人工智能与数据分析领域强者的关键。有很多Python开发人员想知道常用的Python库有哪些&#xff0c;接下来就给大家详细介绍一下。ArrowPython中处理时间的库…

三次握手面试题java_java面试题三次握手和四次挥手-嗨客网

题目对 tcp 了解吗&#xff1f;讲讲它的三次握手和四次挥手&#xff1f;为什么需要三次握手&#xff0c;为什么需要四次挥手。答案三次握手第一次握手&#xff1a;客户端向服务器发送连接请求&#xff0c;这个时候报文首部中的同步为 SYN 1&#xff0c;同时生成一个随机序列号…

运维经验分享(三)-- 解决Ubuntu下crontab不能正确执行脚本的问题

原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dgd2010.blog.51cto.com/1539422/1676490 运维经验分享作为一个专题&#xff0c;目前共7篇文章 《运维经验分享&#xff08;一&#xff0…

一个jsp能取到父类jsp的值吗_「Javaweb」ssm整合权限控制框架shiro,你知道怎么做吗?...

为美好而努力——羊羽科技说。最近在开发自己的网站&#xff0c;需要权限控制功能&#xff0c;在网上找了一下&#xff0c;找到了我接下来要介绍的shiro框架。shiro框架是Apache公司维护的开源产品之一&#xff0c;其官网对其的简介是这样的&#xff1a;shiro官网简介翻译过来就…

php for嵌套循环_PHP中的for循环怎样嵌套

本篇文章主要介绍 PHP中的for循环怎样嵌套&#xff0c;感兴趣的朋友参考下&#xff0c;希望对大家有所帮助。for循环的执行原理&#xff1a;for循环的参数有(初始值&#xff1b;判断条件&#xff1b;更新循环变量表达式) 三者均不是必须的&#xff0c;若三者不完整则必须在适当…

Visio显示不完整

下面显示不完整的话&#xff0c;选中对象&#xff0c;菜单栏设置&#xff08;点击对象&#xff0c;右键并没有段落选项&#xff09;行距为单倍&#xff1b;右侧显示不完整&#xff0c;选中后右键设置环绕方式为负于文字上方&#xff0c;原来是嵌入型。

python2 python3 通信_python与USB通信

Date周三 04 十一月 2015TagsUSB/PythonPyUSB依赖于一些USB的驱动程序, 这个貌似叫做无驱驱动, 其中libusb是一统天下者, 当然就要用这个咯. 那么问题来了, libusb这个驱动是怎么装到要开发的设备上呢? 在windows下答案是Zadig, 这个和rtlsdr用的方案是一致的.下载了最新的Zad…

php设置用户头像,PHP针对多用户实现更换头像功能

一个网站&#xff0c;其实说白了就是某几个特定功能的组合&#xff0c;而更换用户头像就在这些功能之中。今天就来做个测试&#xff0c;针对不同的用户&#xff0c;实现头像上传功能。先给大家展示下成品效果图&#xff1a;思路针对不同的用户上传头像&#xff0c;我们要为每一…

执行计划中cpu耗时_面试被问怎么排查遇到的系统CPU飙高和频繁GC,到底该怎么回答?...

处理过线上问题的同学基本上都会遇到系统突然运行缓慢&#xff0c;CPU 100%&#xff0c;以及Full GC次数过多的问题。当然&#xff0c;这些问题的最终导致的直观现象就是系统运行缓慢&#xff0c;并且有大量的报警。本文主要针对系统运行缓慢这一问题&#xff0c;提供该问题的排…

可视化数据包分析工具-CapAnalysis

原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://chenguang.blog.51cto.com/350944/1325742 可视化数据包分析工具-CapAnalysis 我们知道&#xff0c;Xplico是一个从pcap文件中解析出IP流…

网易云歌单添加到php,给自己的网站添加网易云音乐歌单吧^ ^

这个是怎么实现的&#xff1f;一起来看看吧APlayer首先我们需要一个音频播放器&#xff0c;这里我用到了APlayer&#xff0c;这是由bilibili前端大神DIYgod开源的播放器&#xff0c;有兴趣的可以去TA的主页看看&#xff0c;非常惊艳&#xff0c;这里我就不多说了我们看一下APla…

python学完面向对象之后_Python学完基础语法后,再往后应该学什么?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼第一阶段&#xff1a;Python语言及应用课程内容&#xff1a;Python语言基础&#xff0c;面向对象设计&#xff0c;多线程编程&#xff0c;数据库交互技术&#xff0c;前端特效&#xff0c;Web框架&#xff0c;爬虫框架&#xff0c;…

百度应用部署秘籍

2019独角兽企业重金招聘Python工程师标准>>> 【背景介绍】 传统PaaS采用sandbox实现app间的资源安全隔离&#xff0c;sandbox需要对运行环境和编程语言进行底层的功能限制&#xff0c;例如&#xff1a;禁止创建进程和线程&#xff0c;禁止部分系统调用&#xff0c;禁…

php新闻删除功能设计,php原生开发新闻站之删除新闻

我们前两篇文章都完成了新闻的添加、修改。那么我们这个节课程就给大家介绍删除新闻&#xff0c;这个比之前的两个都要简单点&#xff01;首先创建一个new_delete.php,接着我们要在新闻列表页找到删除的按钮&#xff0c;给这个按钮加一个连接&#xff0c;我们同样需要通过id来传…