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中是否存有用户信息。 

二、实践   

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

#region 将用户名存到cookie中
        /// 
        /// 保存Cookie
        /// 
        /// 
        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
    {
        /// 
        /// OnActionExecuting是Action执行前的操作
        /// 
        /// 
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //判断Cookie用户名密码是否存在
            HttpCookie cookieName = System.Web.HttpContext.Current.Request.Cookies.Get("name");
            if ( cookieName == null)
            {
                filterContext.Result = new RedirectResult("/Login/Index");
            }
        }
    }

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

    [LoginFilter]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "欢迎使用 ASP.NET MVC!";

            return View();
        }
       
        在Controller上打了标签,下边的所有方法执行前都会先执行Filter,实现了过滤。可根据自己的业务,调整标签;或是使用全局的Global。

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


你可能感兴趣的:(【ASP.Net】)