排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备: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>
效果:
欢迎加群讨论技术,群:677373950(满了,可以加,但通过不了),2群:656732739
评价