zoukankan      html  css  js  c++  java
  • 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)。

     1 #region 将用户名存到cookie中  
     2         /// <summary>  
     3         /// 保存Cookie  
     4         /// </summary>  
     5         /// <returns></returns>  
     6         public void CreateCookie()   //此Action自动往cookie里写入登录信息  
     7         {  
     8             HttpCookie UserName = new HttpCookie("name");  
     9             UserName.Value = Request["userName"];  
    10             System.Web.HttpContext.Current.Response.SetCookie(UserName);  
    11             //cookie保存时间  
    12             UserName.Expires = DateTime.Now.AddHours(10);  
    13         }  
    14         #endregion  

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

     1 //类和方法都使用时,加上这个特性,此时都其作用,不加,只方法起作用  
     2 [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)]  
     3 public class LoginFilter:ActionFilterAttribute  
     4 {  
     5     /// <summary>  
     6     /// OnActionExecuting是Action执行前的操作  
     7     /// </summary>  
     8     /// <param name="filterContext"></param>  
     9     public override void OnActionExecuting(ActionExecutingContext filterContext)  
    10     {  
    11         //判断Cookie用户名密码是否存在  
    12         HttpCookie cookieName = System.Web.HttpContext.Current.Request.Cookies.Get("name");  
    13         if ( cookieName == null)  
    14         {  
    15             filterContext.Result = new RedirectResult("/Login/Index");  
    16         }  
    17     }  
    18 }  

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

    1     [LoginFilter]  
    2     public class HomeController : Controller  
    3     {  
    4         public ActionResult Index()  
    5         {  
    6             
    7             return View();  
    8         }  
    9     

    当然还有其他的实现方式比如

    创建BaseWebController继承Controller。

    然后实现OnActionExcuting方法,这样所有继承BaseWebController的Controller中,访问Action时,都会先跑到这里,如果没有登录,就会跳转到Login页面

     1 public class BaseWebController : Controller  
     2     {  
     3   
     4         protected override void OnActionExecuting(ActionExecutingContext filterContext)  
     5         {  
     6             //user为空,并且不是登录页面,则跳转到登录页面。  
     7             if ((filterContext.HttpContext.Session["User"] == null || CurrentUser.id == 0)   
     8                 && (controllerName != "Login" && actionName != "Login"))  
     9             {  
    10                 filterContext.HttpContext.Response.Redirect("/Login/Index");  
    11             }  
    12   
    13             base.OnActionExecuting(filterContext);  
    14         }  
    15   
    16     }  
     
  • 相关阅读:
    CCF_2014_09_2_画图
    计蒜课_等和分隔子集
    计蒜客_合法分数的组合
    读构建之法的读书笔记
    四则运算及感想
    psp 第二周
    第二周 词频统计
    历年作品点评
    四人小组项目
    品读《构建之法》及几个问题的提出
  • 原文地址:https://www.cnblogs.com/HKKD/p/7157625.html
Copyright © 2011-2022 走看看