zoukankan      html  css  js  c++  java
  • ASP.Net MVC Filter验证用户登录

    一、Filter是什么

        ASP.NetMVC模式自带的过滤器Filter,是一种声明式编程方式,支持四种过滤器类型,各自是:Authorization(授权),Action(行为),Result(结果)和Exception(异常)。

    过滤器类型

    接口

    描写叙述

    Authorization

    IAuthorizationFilter

    此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法

    Exception

    IExceptionFilter

    用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常

    Action

    IActionFilter

    用于进入行为之前或之后的处理

    Result

    IResultFilter

    用于返回结果的之前或之后的处理

     

        可是默认实现它们的过滤器仅仅有三种,各自是ActionFilter(方法),Authorize(授权),HandleError(错误处理)。各种信息例如以下表所看到的:


    过滤器

    类名

    实现接口

    描写叙述

    ActionFilter

    AuthorizeAttribute

    IAuthorizationFilter

    此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法

    HandleError

    HandleErrorAttribute

    IExceptionFilter

    用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常

    自己定义

    ActionFilterAttribute

    IActionFilter和IResultFilter

    方法运行前/后的处理。                             返回结果的之前或之后的处理。


        第三种自己定义的过滤器,一定要继承ActionFilterAttribute

    它是ASP.NETMVCFramework提供的基类ActionFilterAttribute。这个类实现了IActionFilter和IResultFilter接口。ActionFilterAttribute有下面几个方法能够重写:

    • OnActionExecuting

      controller action运行之前调用

      OnActionExecuted

      controller action运行之后调用

      OnResultExecuting

      controller action result运行之前调用

      OnResultExecuted

      controller action result运行之后调用


        实现每一个页面都验证cookie中是否存实用户信息。过期用户信息就失效,跳转登录页面。

    总体思路是这种:先在登录Controller中把页面传来的User信息保存到cookie中,设置cookie失效时间。每一个Controller中的方法运行都会先运行Filter。查看cookie中是否存实用户信息。

     

    二、实践   

        首先要把username信息保存到cookie中。在登录的Controller中创建cookie。cookie是一种键值对模式(key, value)。

    #region 将username存到cookie中
            /// <summary>
            /// 保存Cookie
            /// </summary>
            /// <returns></returns>
            public void CreateCookie()   //此Action自己主动往cookie里写入登录信息
            {
                HttpCookie UserName = new HttpCookie("name");
                UserName.Value = Request["userName"];
                System.Web.HttpContext.Current.Response.SetCookie(UserName);
                //cookie保存时间
                UserName.Expires = DateTime.Now.AddHours(10);
            }
            #endregion

        其次,在Filter中创建自己定义的的LoginFilter,检查cookie是否实用户信息:

        //类和方法都使用时,加上这个特性,此时都其作用,不加。仅仅方法起作用
        [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)]
        public class LoginFilter:ActionFilterAttribute
        {
            /// <summary>
            /// OnActionExecuting是Action运行前的操作
            /// </summary>
            /// <param name="filterContext"></param>
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                //推断Cookieusernamepassword是否存在
                HttpCookie cookieName = System.Web.HttpContext.Current.Request.Cookies.Get("name");
                if ( cookieName == null)
                {
                    filterContext.Result = new RedirectResult("/Login/Index");
                }
            }
        }

    最后,要在每一个Controller中打下自己定义的Filter的标签

    <span style="font-size:18px;">    [LoginFilter]
        public class HomeController : Controller
        {
            public ActionResult Index()
            {
                ViewBag.Message = "欢迎使用 ASP.NET MVC!";
    
                return View();
            }
           </span>
            在Controller上打了标签,下边的全部方法运行前都会先运行Filter,实现了过滤。可依据自己的业务。调整标签;或是使用全局的Global。

            这次的Filter学习,暴露了我的一个缺点,调试bug,遇到红色波浪线就ctrl + z 撤销,而不是去认真的看问题,解决这个问题。自检!


  • 相关阅读:
    文字转语音功能
    windows定时计划任务
    写电子合同,爬过的坑,趟过的雷,犯过的错,都是泪
    前端应该如何去认识http
    I/O理解
    观察者模式
    js --代理模式
    js --策略模式
    js --单例模式
    js 单线程 异步
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7008140.html
Copyright © 2011-2022 走看看