四种Filter
在asp.net mvc中提供了四种Filter(过滤器)接口实现了这种AOP机制:IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter。
1)IAuthorizationFilter:在每个Action被执行前执行OnAuthorization方法,一般用来检查当前用户是否具有Action的执行权限。
2)IActionFilter:在每个Action被执行前执行OnActionExecuting方法,每个Action执行完成后执行OnActionExecuted方法。和IAuthorizationFilter的区别在于IAuthorzationFilter在IActionFilter之前执行。
3)IResultFilter:在每个ActionResult的前后执行IResultFilter。
4)IExceptionFilter:当Action执行发生未处理异常的时候执行OnException方法。
定义的类可以在Global总GlobalFilters.Filters.Add(new XXXFilter());的方式添加为全局的过滤器。
IAuthorizationFilter接口的使用
登录权限案例
1)定义两个控制器,登录过滤器(LoginController)、登录成功后的过滤器(MainController)
public class LoginController : Controller
{
// GET: Login
public ActionResult Index()
{
//请求登录界面
return View();
}
//提交登录
public ActionResult Login(string txtName,string txtPwd)
{
if (txtName=="admin"&&txtPwd=="123")
{
Session["User"] = txtName;
return Content("登录成功!" + Session["User"]);
}
return Content("登录失败");
}
}
//登录成功后才能访问
public class MainController : Controller
{
// GET: Main
public ActionResult Index()
{
return Content("欢迎登录!"+Session["User"]);
}
public ActionResult Success()
{
return Content("主界面"+Session["User"]);
}
}
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
<form action="~/Login/Login" method="post">
<input type="text" name="txtName" /><br/>
<input type="text" name="txtPwd" /><br/>
<input type="submit" value="登录"/>
</form>
</div>
</body>
</html>
2)定义实现IAuthorizationFilter接口的类
public class CheckLoginFilter : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
//获取控制器名字
string controllerName=filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
//获取Action方法的名字
string actionName = filterContext.ActionDescriptor.ActionName;
if (controllerName.ToLower()=="Login".ToLower()&&(actionName.ToLower()=="Login".ToLower()||actionName.ToLower()=="Index".ToLower()))
{
//什么都不做
}
else
{
if (filterContext.HttpContext.Session["User"]==null)
{
ContentResult contentResult = new ContentResult();
contentResult.Content = "没有登录!";
//当执行filterContext.Result后,url中没有权限的路径就无法执行Action的方法了,就是阻止了没有权限的Action方法
filterContext.Result = contentResult;
}
}
}
}
重定向:filterContext.Result = new RedirectResult("/login/index");或filterContext.HttpContext.Response.Redirect("/login/index");
第二个重定向不建议使用
3)在Global中添加GlobalFilters.Filters.Add(new CheckLoginFilter());
IExceptionFilter接口的使用
用法和IAuthorizationFilter接口用法一致,捕获异常:Exception ex= filterContext.Exception;