剑轩

asp.net mvc过滤器

发表于:2019/10/10 11:46


过滤器简介:

面向切面的编程方式

可以实现不改动原有逻辑的基础上添加自己的逻辑

使用的时候添加一个配置即可,不想用的时候取消配置就行


过滤器作用范围:

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>

效果:




关于TNBLOG
TNBLOG,技术分享
ICP备案 :渝ICP备18016597号-1
App store Android
精彩评论
{{item.replyName}}
{{item.content}}
{{item.time}}
{{subpj.replyName}}
@{{subpj.beReplyName}}{{subpj.content}}
{{subpj.time}}
猜你喜欢