排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256
50010702506256
欢迎加群交流技术
分类:
.NET MVC
过滤器简介:
面向切面的编程方式
可以实现不改动原有逻辑的基础上添加自己的逻辑
使用的时候添加一个配置即可,不想用的时候取消配置就行
过滤器作用范围:
1:全局过滤器
FilterConfig里边去添加一条
2:控制器级别
使用特性方式加入控制器上面
3: action级别
使用特性方式加入Action上面
过滤器分类:
IActionFilter:action执行之前和执行之后进入该过滤器
IResultFilter:页面返回之前和页面返回之后
IAuthorizationFilter:用来做权限相关,针对性更强一点
IExceptionFilter:全局异常处理
注意:控制器本身就是一个过滤器,而且是具有一个多种类型的过滤器
我们看控制器实现的接口就知道了

时间有限,下面来几个常用过滤器的简单小例子:
权限过滤器:
public class LoginAuthorFilter : AuthorizeAttribute
{
/// <summary>
/// 验证是否有权限
/// 返回false表示验证失败,就是执行HandleUnauthorizedRequest
/// </summary>
/// <param name="httpContext"></param>
/// <returns></returns>
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
UserInfoModel userInfoModel = httpContext.Session["userInfo"] as UserInfoModel;
if (userInfoModel == null)
return false;
else
return true;
}
/// <summary>
/// 没有权限的时候执行
/// </summary>
/// <param name="filterContext"></param>
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result = new RedirectResult("/login/index");
}
}配置过滤器可以使用AllowAnonymous特性来忽略模某些控制器或者action不进行权限验证

异常处理过滤器:
当系统出现异常时执行
public class ExceptionFilter : IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
//获取错误信息
string errorMsg = filterContext.Exception.Message;
//错误页面
string url = filterContext.HttpContext.Request.RawUrl;
//表示异常信息已经被处理
filterContext.ExceptionHandled = true;
using (FileStream file = new FileStream(filterContext.HttpContext.Server.MapPath("~/log/"+DateTime.Now.ToShortDateString().Replace("/","-")+"errolog.txt"), FileMode.Append))
{
using (StreamWriter writer = new StreamWriter(file))
{
writer.WriteLine("错误信息:" + errorMsg);
writer.WriteLine("错误时间:" + DateTime.Now);
writer.WriteLine("错误页面:" + url);
writer.WriteLine("请求方式:" + filterContext.HttpContext.Request.RequestType);
writer.WriteLine("IP地址:" + filterContext.HttpContext.Request.UserHostAddress);
writer.WriteLine("浏览器信息:" + filterContext.HttpContext.Request.UserAgent);
writer.WriteLine("------------------------------------------------------------");
}
}
filterContext.Result = new RedirectResult("/Common/ErrorPage");
}
}Action过滤器:
public class IsLoginFilter : FilterAttribute, IActionFilter
{
public bool isuse = true;
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
//需要放行的
if (isuse == false)
return;
UserInfoModel userInfoModel = filterContext.HttpContext.Session["userInfo"] as UserInfoModel;
string rawUrl = filterContext.HttpContext.Request.RawUrl;
//获取控制的名字
string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
//获取action的名字
string actionName = filterContext.ActionDescriptor.ActionName;
if (userInfoModel == null)
{
//通过指定返回值跳转
filterContext.Result = new RedirectResult("/login/index");
}
}
}过滤器的优先级:
IAuthorizationFilter-->IActionFilter-->IResultFilter
同级的时候可以通过order改变过滤器优先级,数值越小越先执行

第二个参数就是优先级了
显示一个action的所有过滤器:
后台
public ActionResult Index(string errorInfo)
{
//输出某个作用在action的所有过滤器
ReflectedControllerDescriptor rcd = new ReflectedControllerDescriptor(typeof(LoginController));
ActionDescriptor action = rcd.FindAction(ControllerContext, "index");
IEnumerable<System.Web.Mvc.Filter> filters = FilterProviders.Providers.GetFilters(ControllerContext, action);
ViewBag.info = errorInfo;
return View(filters);
}前台
@using System.Web.Mvc
@model IEnumerable<Filter>
<table>
<tr>
<td>过滤器</td>
<td>优先级</td>
<td>作用域</td>
</tr>
@foreach (Filter item in Model)
{
<tr>
<td>@item.Instance</td>
<td>@item.Order</td>
<td>@item.Scope</td>
</tr>
}
</table>效果:

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)
评价