• 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 撤销,而不是去认真的看问题,解决这个问题。自检!


  • 相关阅读:
    size_type、size_t、differentce_type以及ptrdiff_t
    题目1003:A+B ---c_str(),atoi()函数的使用;remove , erase函数的使用
    字符串中符号的替换---replace的用法
    A+B for Matrices 及 C++ transform的用法
    97.5%准确率的深度学习中文分词(字嵌入+Bi-LSTM+CRF)
    详细解读简单的lstm的实例
    如何使用 Pylint 来规范 Python 代码风格
    Python下Json和Msgpack序列化比较
    除了cPickle,cjson外还有没有更高效点的序列化库了
    python对象序列化或持久化的方法
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7008140.html
Copyright © 2020-2023  润新知