记录下过滤器的学习—_—
APS.NET MVC中的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前后如果想再加一些额外的逻辑处理,这样会造成大量代码的重复使用,这不是我们希望的。这时就到了过滤器出场的时候啦。
但是默认实现它们的过滤器只有三种,分别是Authorize(授权),ActionFilter,HandleError(错误处理);
各种信息如下表所示
过滤器 |
类名 |
实现接口 |
描述 |
ActionFilter |
AuthorizeAttribute |
IAuthorizationFilter |
此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法 |
HandleError |
HandleErrorAttribute |
IExceptionFilter |
用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常 |
自定义 |
ActionFilterAttribute |
IActionFilter和IResultFilter |
用于进入行为之前或之后的处理或返回结果的之前或之后的处理 AuthorizeAttribute过滤器 |
首先,我们需要搞清楚什么是过滤器,简单的说过滤器也是一个类,这个类继承自过滤器类
public class MyAuthorizeAttribute:AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
//...
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
//...
}
}
然后用到方法上
[MyAuthorize]
public ActionResult Show()
{
return View();
}
上述用到的是一个自定义授权验证规则,当然如果默认的Authorize过滤器足够我们使用我们也可以使用默认的Authorize,想要自己定义一个自定义授权类可以继承AuthorizeAttribute类,然后重写两个方法:
- bool AuthorizeCore(HttpContextBase httpContext):这里主要是授权验证的逻辑处理,返回true的则是通过授权,返回了false则不是。
- void HandleUnauthorizedRequest(AuthorizationContext filterContext):这个方法是处理授权失败的事情。
例如:我们可以在AuthorizeCore中确认是否授权
return base.AuthorizeCore(httpContext);
在授权失败类中返回到登陆。。。
在登陆验证成功后跳转页面前完成授权
FormsAuthentication.SetAuthCookie(login.UserName, false);
注销
FormsAuthentication.SignOut();
当然注销实在登陆后发生的,所以注销时也要加上[Authorize]授权
登陆页
@model FilterTest.Models.LogInModel
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>登陆</title>
</head>
<body>
<div>
@using( Html.BeginForm())
{
<div> ID:@Html.TextBoxFor(m=>m.Uid) <br />
Password:@Html.PasswordFor(m => m.Pwd) <br />
<input type="submit" value="登陆" /></div>
}
</div>
</body>
</html>
[HttpPost]//这里用了谓词过滤器,只处理POST的请求
public ActionResult Login(LogInModel login)
{
if (login.Uid== "admin" && login.Pwd == "123456")
{
FormsAuthentication.SetAuthCookie(login.UserName, false);
return Redirect("/跳转页。。。");
}
return View();
}
注销
[Authorize]
public ActionResult LogOut()
{
FormsAuthentication.SignOut();
return Redirect("/登陆页。。。");
}
Exception过滤器
创建MyHandleErrorAttribute类,继承HandleErrorAttribute类:
public class MyHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
Exception ex = filterContext.Exception;
//写日志
//Log
filterContext.Result = new RedirectResult("~/error.html");
filterContext.ExceptionHandled = true;
base.OnException(filterContext);
}
然后使用MyHandleErrorAttribute类
[MyHandleErrorAttribute]
public ActionResult GetErr()
{
throw new Exception("this is ThrowErrorLogin Action Throw");
}
跳转不了还要到web.config文件中的<system.web>一节中添加以下代码
<customErrors mode="On" />
当访问这里的GetErr时由于抛出异常会跳转到特定的视图。
|