统一登录验证:

1、定义实体类Person:利用特性标签验证输入合法性设计登录页面

1
2
3
4
5
6
7
8
9
public class Person
{
    [DisplayName("用户名"), Required(ErrorMessage = "账户非空!")]
    public string LoginName { getset; }
    [DisplayName("密 码"), Required(ErrorMessage = "密码非空!")]
    public string Password { getset; }
    [DisplayName("验证码"), Required(ErrorMessage = "验证码非空!")]
    public string Vcode { getset; }
}

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过滤器进行统一登录验证的更多相关文章

  1. MVC过滤器实现用户登录验证

    前言当我们访问某个网站的时候需要检测用户是否已经登录(通过Session是否为null),我们知道在WebForm中可以定义一个BasePage类让他继承System.Web.UI.Page,重写它的 ...

  2. MVC前台页面做登录验证

    最近接触了一个电商平台的前台页面,需要做一个登录验证,具体情况是:当用户想要看自己的订单.积分等等信息,就需要用户登录之后才能查询,那么在MVC项目中我们应该怎么做这个前台的验证呢? 1.我在Cont ...

  3. asp.net mvc中的用户登录验证过滤器

    在WEB项目中建立 类:      public class LoginFilter : ActionFilterAttribute     {         public override voi ...

  4. mvc 3 Mvc 4 使用Forms 登录验证随笔一

    前言 本人虽然做 .Net 也有五年有余,可是没什么大才,总是干些打杂的活,技术很少差劲呀.以前不管是做内部管理系统,还是企业平台,保存用户登录信息用的都是Session,也许是从一开始就接触Sess ...

  5. MVC过滤器详解 面向切面编程(AOP)

    面向切面编程:Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题.AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个 ...

  6. [MVC学习笔记]5.使用Controller来代替Filter完成登录验证(Session校验)

          之前的学习中,在对Session校验完成登录验证时,通常使用Filter来处理,方法类似与前文的错误日志过滤,即新建Filter类继承ActionFilterAttribute类,重写On ...

  7. 过滤器实现Token验证(登录验证+过期验证)---简单的实现

    功能:登录验证+过期验证+注销清除cookie+未注销下关闭或刷新浏览器仍可直接访问action概述:token只存在客户端cookie,后端AES加密+解密+验证,每一次成功访问action都会刷新 ...

  8. asp.net MVC 过滤器使用案例:统一处理异常顺道精简代码

    重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章<精简自己20%的代码>中,讨论了异常的统一处理,并 ...

  9. C# mvc中为Controller或Action添加定制特性实现登录验证

    在本文开始前,先简单讲两个知识点: 1.每个action执行前都会先执行OnActionExecuting方法: 2.FCL提供了多种方式来检测特性的存在,比如IsDefined.GetCustomA ...

随机推荐

  1. RedMine 版本管理工具

    一.介绍: Redmine 是一个开源的.基于Web的项目管理和缺陷跟踪工具.它用日历和甘特图辅助项目及进度可视化显示.同时它又支持多项目管理.Redmine是一个自由开放 源码软件解决方案,它提供集 ...

  2. html---id,name和value

    id是唯一标识符,不允许有重复值(类似数据表的主键,pk),可以通过它的值来获得对应的html标签对象.(如果在同一页面代码中,出现重复的id,会导致不可预料的错误) js代码可通过document. ...

  3. 转:onkeypress、onkeydown、onkeyup 区别

    在使用JavaScript做WEB键盘事件侦听捕获时,主要采用onkeypress.onkeydown.onkeyup三个事件进行出来.该三个事件的执行顺序如下:onkeydown -> onk ...

  4. JS 之 offsetWidth\offsetleft

  5. Saiku对Measure(指标)查询结果进行计算后显示的方法

    在通过Saiku查询数据的时候,当需要改变查询结果的显示方式的时候,可以添加formatString属性,但是当需要计算查询结果的时候,则需要使用CellFormatter,使用方法如下: <M ...

  6. iOS实现文件上传功能模块

    iOS实现文件上传功能,首先要知道的是,上传到服务器的数据格式,一般采用HTTP文件上传协议.如下图 如图所示,只要设置好了HTTP的协议格式,就可以实现文件上传功能. 代码如下: //图片上传模块 ...

  7. python代码的书写要求

    刚刚接触python,python是对缩进要求很严格的语言,对于我这种平时tab,空格乱用的菜鸟来说简直是吃劲苦头阿,经常出现IndentationError.在这里我就结合自己的经历说说书写格式,如 ...

  8. JavaScript之apply()和call()的区别

    我 在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示 例,总算是看的有点眉目了,在这里我做如下笔记,希望和 ...

  9. UpdatePanel + 弹出框

    ScriptManager.RegisterStartupScript(UpdatePanel1, this.GetType(), "", "alert('操作成功!') ...

  10. ##DAY11 UITableView编辑

    ##DAY11 UITableView编辑 每一个视图控制器都有一个编辑按钮,因为项目中编辑的应用场景非常多,所以系统预留了一个编辑按钮供我们使用 self.navigationItem.leftBa ...