【无私分享:从入门到精通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在真实项…

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

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

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

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

三次握手面试题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设置用户头像,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…

百度应用部署秘籍

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

java8新特性_JAVA8十大新特性详解

一、接口的默认方法Java 8允许我们给接口添加一个非抽象的方法实现&#xff0c;只需要使用 default关键字即可&#xff0c;这个特征又叫做扩展方法&#xff0c;示例如下&#xff1a;interface Formula { double calculate(int a); default double sqrt(int a) { return Math.sq…

spark1.6.1 on yarn搭建部署

注&#xff1a;本文是建立在hadoop已经搭建完成的基础上进行的。 Apache Spark是一个分布式计算框架&#xff0c;旨在简化运行于计算机集群上的并行程序的编写。该框架对资源调度&#xff0c;任务的提交、执行和跟踪&#xff0c;节点间的通信以及数据并行处理的内在底层操作都进…

主线程是如何向子线程传递数据的?_c++ 利用thread创建线程

用进行多线程开发小时候&#xff0c;老师总是教育我们上课要专心&#xff0c;“一心不可二用”。可是CPU这个不听话的“熊孩子”偏偏却在一个芯片中加入了两个甚至多个运算核心&#xff0c;想要一“芯”二用。从硬件厂商的角度&#xff0c;通过增加CPU的运算核心&#xff0c;突…

php多维数组交集,求数组差/交集函数-php数组函数(二)

求数组差集函数函数只检查了多维数组中的一维。可以用 array_diff($array1[0], $array2[0]) 检查更深的维度。u&#xff1a;自定义函数比较&#xff0c;a(association)&#xff1a;同时比较键和值。自定义函数callable $value_compare_func必须返回一个小于零&#xff0c;等于零…

正则过滤符号_多角度理解正则项

过拟合和欠拟合什么是过拟合和欠拟合过拟合&#xff1a;模型在训练集上效果好&#xff0c;在测试集上效果差欠拟合&#xff1a;在训练集上效果就不好产生过拟合的原因参数太多&#xff0c;模型复杂度太高数据量少&#xff0c;训练轮次过多样本中噪声较大&#xff0c;模型拟合了…

PHP页面中嵌套go语言,go语言嵌套类型的使用细节

1. 定义在Go语言中&#xff0c;嵌套类型是将已有的类型直接声明在新的结构类型里。被嵌入的类型被称为新的外部类型的内部类型。通过嵌入类型&#xff0c;与内部类型相关的成员变量会提升到外部类型上。就好像这些成员变量直接声明在外部类型一样。如下图所示&#xff1a;外部类…

jvm内存模型_JVM内存模型的相关概念

1.前言Android的虚拟机是根据移动设备的特点基于Java虚拟机(JVM)改进而来&#xff0c;虽然没有保留规范&#xff0c;但作为Java语言的使用者&#xff0c;了解一下JVM的规范还是有必要的。2.JVM内存模型JVM在执行Java程序时&#xff0c;会把它管理的内存划分为若干个的区域&…

LNMP/LEMP(PHP7.0.04+mysql5.7.12+nginx1.10.0)

预览:Installing Nginx with PHP 7 and MySQL 5.7 (LEMP) on Ubuntu 16.04 LTSThis tutorial exists for these OS versionsUbuntu 15.10 (Wily Werewolf)Ubuntu 14.04 LTS (Trusty Tahr)Ubuntu 13.04 (Raring Ringtail)Ubuntu 12.10 (Quantal Quetzal)Ubuntu 12.04 LTS (Preci…

length函数的头文件_Framebuffer 应用编程中涉及的 API 函数

本节程序的目的是&#xff1a;打开 LCD 设备节点&#xff0c;获取分辨率等参数&#xff0c;映射 Framebuffer&#xff0c;最后实现描点函数。5.2.1 open 函数在 Ubuntu 中执行“man 2 open”&#xff0c;可以看到 open 函数的说明&#xff1a;头文件&#xff1a;#include <s…