MVC过滤器进行统一登录验证
统一登录验证:
1、定义实体类Person:利用特性标签验证输入合法性设计登录页面
|
1
2
3
4
5
6
7
8
9
|
public class Person{ [DisplayName("用户名"), Required(ErrorMessage = "账户非空!")] public string LoginName { get; set; } [DisplayName("密 码"), Required(ErrorMessage = "密码非空!")] public string Password { get; set; } [DisplayName("验证码"), Required(ErrorMessage = "验证码非空!")] public string Vcode { get; set; }} |
2、设计验证码
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
public class VcodeController : Controller{ // // GET: /Vcode/ public ActionResult Vcode() { byte[] buffer; string str = GetRdStr(5); //将生成随机字符串存入session中 Session["vcode"] = str; using(Image img=new Bitmap(80,30)) { using(Graphics g=Graphics.FromImage(img)) { //清除背景色 g.Clear(Color.White); g.DrawRectangle(Pens.Black, 0, 0, img.Width - 1, img.Height - 1); DrawLines(50, img, g); g.DrawString(str, new Font("微软雅黑", 16), Brushes.Black, 0, 0); DrawLines(35, img, g); } using(System.IO.MemoryStream ms=new System.IO.MemoryStream()) { img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); buffer=ms.ToArray(); } } return File(buffer,"image/jpeg"); } /// <summary> /// 定义随机对象 /// </summary> Random rd = new Random(); /// <summary> /// 生产指定长度随机字符串 /// </summary> /// <returns>随机字符串</returns> string GetRdStr(int count) { string str = "abcdefghijkmnpqrstuvwxyzABCDEFGHIJKMNPQRSTUVWXYZ23456789"; System.Text.StringBuilder sb = new System.Text.StringBuilder(); for(int i=0;i<count;i++) { sb.Append(str[rd.Next(str.Length)]); } return sb.ToString(); } /// <summary> /// 绘制指定数量干扰线 /// </summary> /// <param name="count">数量</param> /// <param name="img">图片对象</param> /// <param name="g">画家对象</param> void DrawLines(int count,Image img,Graphics g) { for(int i=0;i<count;i++) { Point p1 = new Point(rd.Next(img.Width - 1), rd.Next(img.Height - 1)); Point p2 = new Point(p1.X + rd.Next(-1, 2), p1.X + rd.Next(-1, 2)); g.DrawLine(Pens.AliceBlue, p1, p2); } }} |
3、设计登录页面,并写入登录逻辑
前台页面
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
@{ ViewBag.Title = "Login";}@using 统一登录2.Models@model Person<script src="~/Scripts/jquery.validate.js"></script><script src="~/Scripts/jquery.validate.unobtrusive.js"></script>@using (@Html.BeginForm("Login", "Login", FormMethod.Post)){ <table> <tr> <th>@Html.DisplayNameFor(p => p.LoginName)</th> <td> @Html.TextBoxFor(p => p.LoginName) @Html.ValidationMessageFor(p => p.LoginName) </td> </tr> <tr> <th>@Html.DisplayNameFor(p => p.Password)</th> <td> @Html.PasswordFor(p => p.Password) @Html.ValidationMessageFor(p => p.Password) </td> </tr> <tr> <th>@Html.DisplayNameFor(p => p.Vcode)</th> <td> @Html.TextBoxFor(p => p.Vcode) <img src="@Url.Action("Vcode", "Vcode")" /> @Html.ValidationMessageFor(p => p.Vcode) </td> </tr> <tr> <th></th> <td> <input type="submit" value="登录" /> </td> </tr> </table>}<script type="text/javascript"></script> |
后台逻辑
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
public class LoginController : Controller{ // // GET: /Login/ [HttpGet] public ActionResult Login() { return View(); } [HttpPost] public ActionResult Login(Person model) { //判断实体验证是否成功 if (ModelState.IsValid == false) { ModelState.AddModelError("", "实体验证失败!"); return View(); } //判断验证码验证是否成功 if(Session["vcode"]!=null&&Session["vcode"].ToString().Equals(model.Vcode,StringComparison.OrdinalIgnoreCase)) { ModelState.AddModelError("", "验证码输入不正确!"); return View(); } //判断账户密码验证是否成功 if(model.LoginName!="admin"||model.Password!="123") { ModelState.AddModelError("", "用户名或密码错误!"); return View(); } //登录成功,登录信息存入Session Session["uInfo"] = model; //跳转到主页面 return RedirectToAction("Index", "Home"); }} |
4、在过滤器中写入统一验证逻辑--注:这里用标签来判断是否需要进行登录验证,标签类实在第五步定义
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
public override void OnActionExecuting(ActionExecutingContext filterContext){ //判断是否需要登录验证 if(filterContext.ActionDescriptor.IsDefined(typeof(IgnoreLoginAttribute),false)) { return; } if (filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(IgnoreLoginAttribute), false)) { return; } //根据Session进行登录验证 if(filterContext.HttpContext.Session["uInfo"]==null) { //1.Ajax请求 if(filterContext.HttpContext.Request.IsAjaxRequest()) { JsonResult jsonView = new JsonResult(); jsonView.ContentType = "application/json"; jsonView.Data = new {status=2,msg="未登录" }; jsonView.JsonRequestBehavior = JsonRequestBehavior.AllowGet; filterContext.Result = jsonView; } //2.一般请求 else { ContentResult contentView = new ContentResult(); contentView.Content = "<script>window.alert('您还没有登录!请重新登录...');window.location='/Login/Login'</script>"; filterContext.Result = contentView; } }} |
5、定义自定义特性标签,不需要登录验证统一贴上特性标签
|
1
2
3
4
5
6
7
|
/// <summary>/// 是否忽略登录验证特性标签/// </summary>[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,AllowMultiple=false)]public class IgnoreLoginAttribute:Attribute{} |
MVC过滤器进行统一登录验证的更多相关文章
- MVC过滤器实现用户登录验证
前言当我们访问某个网站的时候需要检测用户是否已经登录(通过Session是否为null),我们知道在WebForm中可以定义一个BasePage类让他继承System.Web.UI.Page,重写它的 ...
- MVC前台页面做登录验证
最近接触了一个电商平台的前台页面,需要做一个登录验证,具体情况是:当用户想要看自己的订单.积分等等信息,就需要用户登录之后才能查询,那么在MVC项目中我们应该怎么做这个前台的验证呢? 1.我在Cont ...
- asp.net mvc中的用户登录验证过滤器
在WEB项目中建立 类: public class LoginFilter : ActionFilterAttribute { public override voi ...
- mvc 3 Mvc 4 使用Forms 登录验证随笔一
前言 本人虽然做 .Net 也有五年有余,可是没什么大才,总是干些打杂的活,技术很少差劲呀.以前不管是做内部管理系统,还是企业平台,保存用户登录信息用的都是Session,也许是从一开始就接触Sess ...
- MVC过滤器详解 面向切面编程(AOP)
面向切面编程:Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题.AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个 ...
- [MVC学习笔记]5.使用Controller来代替Filter完成登录验证(Session校验)
之前的学习中,在对Session校验完成登录验证时,通常使用Filter来处理,方法类似与前文的错误日志过滤,即新建Filter类继承ActionFilterAttribute类,重写On ...
- 过滤器实现Token验证(登录验证+过期验证)---简单的实现
功能:登录验证+过期验证+注销清除cookie+未注销下关闭或刷新浏览器仍可直接访问action概述:token只存在客户端cookie,后端AES加密+解密+验证,每一次成功访问action都会刷新 ...
- asp.net MVC 过滤器使用案例:统一处理异常顺道精简代码
重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章<精简自己20%的代码>中,讨论了异常的统一处理,并 ...
- C# mvc中为Controller或Action添加定制特性实现登录验证
在本文开始前,先简单讲两个知识点: 1.每个action执行前都会先执行OnActionExecuting方法: 2.FCL提供了多种方式来检测特性的存在,比如IsDefined.GetCustomA ...
随机推荐
- asp.net mvc 注册中的邮箱激活功能实现(二)
邮件发送功能封装 /// <summary> /// 发送注册邮件 /// </summary> /// <param name ...
- C语言入门(10)——if分支语句
在我们写的函数中可以有多条语句,但这些语句总是从前到后顺序执行的.除了从前到后顺序执行之外,有时候我们需要检查一个条件,然后根据检查的结果执行不同的后续代码,在C语言中可以用分支语句实现,比如: if ...
- 蓝桥杯之K好数问题
问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22 ...
- 在线词典php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- android 内存优化
OOM 内存泄漏引起很多问题: 1:节目卡顿.反应慢(高内存使用情况JVM 虚拟机的频繁离职GC) 2:消失 3:直接崩溃 ANDROID 内存面临的问题 1: 有限的堆内存,原始仅仅有16M 2:内 ...
- ContentType 属性 MIME
".asf" = "video/x-ms-asf" ".avi" = "video/avi" ".doc&qu ...
- 蓝桥杯试题集【Java】
一.Fibonacci数列 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. ...
- 【转】在SQL Server 2008中SA密码丢失了怎么办?
sql server 2008的sa用户莫名其妙就登陆不进去了.提示如下: 以上提示就表明是密码错误,但密码我可是记得牢牢的,也许是系统被黑的原因吧.一直以来我的Windows身份验证就用不起,以下方 ...
- Oracle 导入本地dmp文件 详细操作步骤
以下操作均在命令行窗口中进行 /*连接数据库*/ C:\Users\hqbhonker>sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Prod ...
- GCD的使用和面试题集锦
GCD 分为异步和同步 异步: dispatch_async ( 参数1 , { } 同步: dispatch_sync( 参数1 , { } 参数1 :队列 队列分为两种: dispatch_get ...