一、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是否有用户信息:
最后,要在每个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 }