首页 > 技术文章 > MVC常用筛选器Filter

lgxlsm 2017-04-18 16:08 原文

1.ActionFilterAttribute

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WolfUI.Filter
{
    public class wolfFilterAttribute : ActionFilterAttribute
    {
        //action method调用前发生。
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            Debug.WriteLine("OnActionExecuting");
        }
        //action method调用后发生, 但是在result执行前发生 (在 view 呈现前)
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            Debug.WriteLine("OnActionExecuted");
        }
        //result执行前发生(在view 呈现后)
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            Debug.WriteLine("OnResultExecuted");
        }
        //result执行前发生(在view 呈现前)
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            Debug.WriteLine("OnResultExecuting");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WolfUI.Filter
{
    /// <summary>
    /// 接口参数验证过滤器
    /// author:wolf
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true)]
    public class ModelValidationAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext actionContext)
        {
            var viewData = actionContext.Controller.ViewData;
            var modelState = viewData.ModelState;
            if (!modelState.IsValid)
            {
                string error = string.Empty;
                foreach (var key in modelState.Keys)
                {
                    var state = modelState[key];
                    if (state.Errors.Any())
                    {
                        error = state.Errors.First().ErrorMessage;
                        break;
                    }
                }
                actionContext.Result = new JavaScriptResult() { Script = $"$tools.dangerTip('{error}','');" };
            }
        }
    }
}

2.HandleErrorAttribute

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace SuiBao.WebBI.Filter
{
    public class ExceptionLogAttribute : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            //写错误日志记录
            string url = HttpContext.Current.Request.Url.AbsoluteUri;
            string message = string.Format("异常页面:{0}\r\n引发异常源:{1}\r\n消息类型:{2}\r\n消息内容:{3}\r\n引发异常的方法:{4}\r\n堆栈信息:{5}"
                , url
               , filterContext.Exception.Source
                , filterContext.Exception.GetType().Name
                , filterContext.Exception.Message
                 , filterContext.Exception.TargetSite,
                 filterContext.Exception.StackTrace
                 );
            if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
            {
                SuiBao.Utility.LogHelper.Exception(message);
                var reqWith = filterContext.RequestContext.HttpContext.Request.Params["X-Requested-With"];
                //还有一种判断办法,根据报文头里的accept类型,参考权限验证里面
                if (!string.IsNullOrEmpty(reqWith) && reqWith == "XMLHttpRequest")
                {
                    filterContext.Result = new JavaScriptResult() { Script = "$tools.dangerTip( '系统错误,请稍候再试!');" };
                }
                else
                {
                    filterContext.Result = new JsonNetResult() { Data = new { Success = false, Msg = "系统错误,请稍候再试!" } };
                }
            }
            else
            {
                SuiBao.Utility.LogHelper.Exception(message);
                //根据状态码处理
                int statusCode = new HttpException(null, filterContext.Exception).GetHttpCode();
                if (statusCode == 500)
                {
                    filterContext.Result = new RedirectResult("/Error/Http_500");
                    filterContext.HttpContext.Response.StatusCode = 500;
                }
                else if (statusCode == 404)
                {
                    filterContext.Result = new RedirectResult("/Error/Http_404");
                    filterContext.HttpContext.Response.StatusCode = 404;
                }
            }
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;

        }
    }
}

3.AuthorizeAttribute

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WolfUI.Filter
{
    public class AuthorizeDiy : AuthorizeAttribute
    {
        /// <summary>
        /// 提供一个入口用于自定义授权检查
        /// </summary>
        /// <param name="httpContext"></param>
        /// <returns></returns>
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            bool pass = false;
            HttpCookie cookie = HttpContext.Current.Request.Cookies["admin"];
            if (cookie == null || cookie.Value == null)
            {
                httpContext.Response.StatusCode = 401;
                pass = false;
            }
            else
            {
                pass = true;
            }
            return pass;
        }

        /// <summary>
        /// 处理未能授权的Http请求
        /// </summary>
        /// <param name="filterContext"></param>
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            base.HandleUnauthorizedRequest(filterContext);
            filterContext.HttpContext.Response.Write(filterContext.HttpContext.Response.StatusCode);
            if (filterContext.HttpContext.Response.StatusCode == 401)
            {
                //跳转到登录界面
                filterContext.Result = new RedirectResult("/Login");
            }
        }
    }
}

 

4.设置全局过滤

 public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //登录验证
            filters.Add(new AuthorizationAttribute());
            //异常处理
            filters.Add(new ExceptionLogAttribute());
        }
    }

 

推荐阅读