MVC常用篩選器Filter


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());
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM