MVC提供了四种Filter(钩子),用于在Action执行之前或者之后,我们能够做一些事情,比如说判断有没有登录,比如说判断有没有权限。

IAuthorizationFilter:在所有Filter和Action执行之前执行

IActionFilter:分别在Action执行之前和之后执行。

IResultFilter:分别在Action Result执行之后和之前

IExceptionFilter:只有在filter,或者 action method, 或者 action result 抛出一个异常时候执行

做登录验证,用IAuthorizationFilter应该是最好的选择,比如系统自带的登陆与权限验证,就是用这个做的。但是我们今天要讲的是如何用ActionFilter做登录的验证。

我们转到Controller的定义的时候,发现是这样子的:

public abstract class Controller : ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IController, IAsyncManagerContainer

看到IActionFilter接口了木有,这让我们找到一个思路:新建一个基类,在该类中重载OnActionExecuting方法,这样子整个在所有Action执行之前都会先判断权限了:

public class BaseControllerfalse : Controller
{
//system.web.mvc
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.Cookies["UserID"] == null)
{
if (this.RouteData.Values["Controller"].ToString() != "Login")
{
//跳转到登陆页
filterContext.Result = new RedirectResult("/Login/Index");
}
}
base.OnActionExecuting(filterContext);
}
}

如上代码通过判断Cookies中的UserID来判断用户是否登陆,如果没有登陆,就跳转到Login/Index中去。你将其它所有需要验证登陆的controller继承自baseController就可以实现判断登陆了。

但是LoginController只能够直接继承自Controller,否则程序判断你没有登陆,然后跳转到Login,但是在Login实现Index之前,程序判断你仍然没有登陆,于是又跳转到Login,实现了一个死循环。

最新文章

  1. MSSQL反旋转的例子
  2. css3整理--::selection
  3. ZJOI 游记
  4. 数据库(MSSQLServer,Oracle,DB2,MySql)常见语句以及问题
  5. javaee学习-JSP指令简介
  6. head命令
  7. ERROR: Error in Log_event::read_log_event(): 'read error', data_len: 438, event_type: 2
  8. maven系列小技巧之Top3 MVQ(most valuable question)
  9. webStrom支持Vue
  10. 201521123104 《JAVA程序设计》第二周学习总结
  11. 【Java基础】求出1-100之间偶数和
  12. Tex_安装_在Ubuntu系统下
  13. 12.2RAC搭建记录
  14. hdu 5055
  15. php 去除数组中指定的值
  16. C#反射学习
  17. 使用IDEA复用代码时常见问题
  18. CF&&CC百套计划3 Codeforces Round #204 (Div. 1) D. Jeff and Removing Periods
  19. springboot中使用JOIN实现关联表查询
  20. CSS居中之美

热门文章

  1. Error524 源站处理超时 Error 524: A timeout occurred
  2. Android笔记之动态地添加View
  3. pm2 的使用
  4. CALL FUNCTION 'BAPI_PO_CREATE1' 相关报错
  5. Python网络编程--Echo服务
  6. 经典数学问题<手电过河问题>的动态解法--问题规模扩展至任意大小
  7. Codeforces Round #551 (Div. 2) A~E题解
  8. FZU1989 AntiAC —— 字符串
  9. elasticsearch _source字段的一些说明
  10. codeforces 558C C. Amr and Chemistry(bfs)