MVC过滤器进行统一登录验证

统一登录验证:

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过滤器进行统一登录验证,布布扣,bubuko.com

时间: 2024-10-21 09:15:09

MVC过滤器进行统一登录验证的相关文章

MVC模式编程示例-登录验证(静态)

好,上篇博客分享了本人总结的JSP-Servlet-JavaBean三层架构编程模式的实现思想和基本流程,接下来给大家分享一个MVC编程模式的实现示例-登录验证的过程,这里我仍然用的是静态的验证用户名和密码,连接数据库的过程我其他博客有,这里只是把一个实现过程告诉大家,不多说,见代码: 首先建一个JSP登录页面 其次,我们建一个Servlet类获取客户端提交的信息 然后,我们需要在web.xml配置Servlet选项,好像现在的Eclipse都是自动生成了Servlet的配置代码,不过大家还是看

MVC过滤器---身份验证过滤器

身份验证过滤器的用法(一) 1.首先创建一个自己定义的过滤类继承MVC身份验证过滤类,重写OnAuthorization方法 public class MyAuthorization:AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { //如果保留如下代码,则会运行.net framework定义好的身份验证,如果希望自定义身份验证,则删除如下代码 //ba

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

      之前的学习中,在对Session校验完成登录验证时,通常使用Filter来处理,方法类似与前文的错误日志过滤,即新建Filter类继承ActionFilterAttribute类后重写OnActionExecuting方法,在RegisterGlobalFilters方法中注册新建的Filter类,之后直接在需要验证的Action前加上Filter标记即可. 1. 新建登陆校验类CheckLoginAttribute using System.Web.Mvc; namespace P

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

重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章<精简自己20%的代码>中,讨论了异常的统一处理,并通过对异常处理的封装达到精简代码的目的.具体有两种处理方法: 方法1:封装一个包含try{}catch{}finally{}的异常处理逻辑的方法类,将别的方法作为参数传入该方法,在页面内调用封装后的方法,大体代码如下: public class Process { public static bool Exe

通过定制特性灵活判断C# mvc中的action是否需要登录验证

在实现通过定制特性灵活判断mvc中的action是否需要登录验证之前,先简单讲两个知识点: 1.每个action执行前都会先执行OnActionExecuting方法: 2.FCL提供了多种方式来检测特性的存在,比如IsDefined.GetCustomAttributes方法等,IsDefined方法仅仅是判断目标有没有应用指定特性,而GetCustomAttributes方法会构造指定特性的新实例. 一.下面先利用OnActionExecuting和IsDefined这两个方法实现判断act

Filter登录验证过滤器(全局)

通过Filter来定义一个登录验证过滤器,这是就不需要在每一个JSP页面添加判断用户合法性的代码了. 以下示例中包含了5个文件,一个是登录表单LoginForm.jsp,一个是登录判断页LoginConf.jsp, 一个是登录验证过滤器LoginFilter.java,一个是登录成功页面LoginSucess.jsp,一个是登录失败 页面Loginfailure.jsp. LoginForm.jsp 1 <%@ page language="java" import="

Asp.net MVC访问母版页中嵌套的iframe页面时,如果session或cookie过期,登录验证超时怎样自动跳转到登录页

一般登录验证的过滤器中,使用验证过滤器的Redirect方法,将请求重定向到指定的URL.但是如果我们要访问的页面是一个嵌套在母版页中的iframe页面时,这种重定向只会对iframe页面凑效,也就是会将iframe也重定向到登录页,这样就有违我们的目的了.所以我就尝试了很多方法来实现让整个页面重定向到登录页的目标,接下里我就来分享一下我的心路历程~~如果想看解决方法,可以直接拉到最后,忽略我的啰啰嗦嗦~~ 首先,我尝试了替换掉Redirect,改用了Write方法,意在将指定字符串写入HTTP

过滤器实现登录验证及拒绝直接输url访问网页

package com.filter; import java.io.ioexception; import javax.servlet.filter; import javax.servlet.filterchain; import javax.servlet.filterconfig; import javax.servlet.servletexception; import javax.servlet.servletrequest; import javax.servlet.servlet

MVC过滤器详解

APS.NET MVC中(以下简称“MVC”)的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理.这时候就用到了过滤器. MVC支持的过滤器类型有四种,分别是:Authorization(授权),Action(行为),Result(结果)和Exception(异常).如下表, 过滤器类型 接口 描述 Authorization IAuthorizationFilter 此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法 Exce