1. 程式人生 > 其它 >9-3.MVC 自定義過濾器(Filter)實現路由控制、異常處理、授權處理(獲取客戶端資訊)

9-3.MVC 自定義過濾器(Filter)實現路由控制、異常處理、授權處理(獲取客戶端資訊)

https://blog.csdn.net/zy0421911/article/details/54911712?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&utm_relevant_index=2

MVC 自定義過濾器(Filter)可以實現路由控制、異常處理、授權處理(獲取客戶端資訊)

由於Controller 實現了 IActionFilter 、IAuthorizationFilter、IExceptionFilter 等幾個過濾器介面,故可以自定義類實現這幾個介面 然後在 FilterConfig.cs檔案中 註冊這幾個過濾器 實現切面控制,具體程式碼如下:

FilterConfig.cs

//將自定義異常過濾器的優先順序提高,防止異常被預設的HandleError處理(也可以自定義類重寫HandleErrorAttribute 實現錯誤處理)
filters.Add(new SystemIExceptionFilter(), 1
); //控制器過濾器 filters.Add(new SystemIActionFilter(), 2); //授權過濾器 filters.Add(new SystemIAuthorizationFilter(), 3);

路由訪問過濾器:

public class SystemIActionFilter : IActionFilter
    {
        //
        // Summary:
        //     Called after the action method is invoked.
        //      在Action返回之後
        // Parameters:
        
// filterContext: // Information about the current request and action. public void OnActionExecuted(ActionExecutedContext filterContext) { } // // Summary: // Called before the action method is invoked. // 在進入Action之前 // 說明:使用RedirectToRouteResult進行路由值進行重定向時 // RouteName 路由名稱 // RouteValues 路由值 特別注意第三個值 Permanent 獲取一個值 // 該值指示重定向是否應為永久重定向 如果為true 在本程式會出現問題 // Parameters: // filterContext: // Information about the current request and action. public void OnActionExecuting(ActionExecutingContext filterContext) { //驗證 控制器 檢視 string tempAction = filterContext.RouteData.Values["action"].ToString(); string tempController = filterContext.RouteData.Values["controller"].ToString(); string tempLoginAction = filterContext.RouteData.Values["action"].ToString(); if (tempAction == "HomeLogin" && tempController == "Home" || tempLoginAction == "UserLogin" ? false : true) { //請求登入時 if (tempAction == "UserLogin" && tempController == "Home" ? false : true) { //Cookie HttpCookie tempToken = filterContext.HttpContext.Request.Cookies["exclusiveuser_token"]; if (tempToken == null) { filterContext.Result = new RedirectToRouteResult("HomeLogin", new RouteValueDictionary(new { controller = "Home", action = "HomeLogin" }), false); } //登入token不為null時 進行合法性驗證token 頭部,載荷,簽名,cookie過期時間 if (tempToken == null ? false : true) { //UserToken 方法 將驗證 token 合法性 包括token 簽名 ,token載荷,cookie 過期時間等 string SystemToken = new SecondTrackToken().UserToken(); if (SystemToken == null) { filterContext.Result = new RedirectToRouteResult("HomeLogin", new RouteValueDictionary(new { controller = "Home", action = "HomeLogin" }), false); }; } } } } }

異常處理過濾器

  public class SystemIExceptionFilter : IExceptionFilter
    {
         void IExceptionFilter.OnException(ExceptionContext filterContext)
        {
            Exception exception = filterContext.Exception;
            if (filterContext.ExceptionHandled)
            {
                return;
            }
            HttpException http = new HttpException(null, exception);
            /* 
             * filterContext.Exception.Message 錯誤資訊
              */
            string messager = filterContext.Exception.Message;
 
            /* 
             * 錯誤日誌
              */
            Log4NetHelp help = new Log4NetHelp();
            help.ErrorString(filterContext.Exception.Message);
            /* 
             * 設定自定義異常已經處理,避免其他過濾器異常覆蓋
              */
            filterContext.ExceptionHandled = true;
 
            /* 
             * 在派生類重寫時,設定或者重寫一個值該值指定是否禁用ISS7.0中自定義錯誤
              */
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
    }

授權處理(獲取客戶端資訊)

 public class SystemIAuthorizationFilter : IAuthorizationFilter
    {
        void IAuthorizationFilter.OnAuthorization(AuthorizationContext filterContext)
        {
            //當前操作計算機使用者 
            string pcName = ((System.Web.HttpServerUtilityWrapper)((System.Web.HttpContextWrapper)filterContext.RequestContext.HttpContext).Server).MachineName;
            //檢視
            string action = ((System.Web.Mvc.ReflectedActionDescriptor)filterContext.ActionDescriptor).ActionName;
            //控制器
            string controller = ((System.Web.Mvc.ReflectedActionDescriptor)filterContext.ActionDescriptor).ControllerDescriptor.ControllerName;
            //請求時間
            string time = filterContext.RequestContext.HttpContext.Timestamp.ToString();
            //請求相對路徑
            string absturl = ((System.Web.UnvalidatedRequestValuesWrapper)((System.Web.HttpRequestWrapper)((System.Web.HttpContextWrapper)filterContext.RequestContext.HttpContext).Request).Unvalidated).Url.AbsoluteUri;
            //狀態
            string code = ((System.Web.HttpResponseWrapper)((System.Web.HttpContextWrapper)filterContext.RequestContext.HttpContext).Response).Status;
            // 瀏覽器版本
            string browser = ((System.Web.HttpBrowserCapabilitiesWrapper)((System.Web.HttpRequestWrapper)((System.Web.HttpContextWrapper)filterContext.RequestContext.HttpContext).Request).Browser).Type;
            //請求方式
            string gepPost = ((System.Web.HttpRequestWrapper)((System.Web.Mvc.Controller)filterContext.Controller).Request).RequestType;
            //本地主機名稱解析DNS本身處理。
            string server = ((System.Web.HttpRequestWrapper)((System.Web.HttpContextWrapper)filterContext.HttpContext).Request).UserHostAddress;
            #region  server 說明
            /*
              * 版權(c)1993 - 2009微軟(msft . o:行情)。
              *
              * 這是一個示例所使用的主機檔案微軟為Windows TCP / IP。
              *
              * 這個檔案包含IP地址到主機名的對映。
                          每一個
              * 條目應該儲存在單個行。
              IP地址應
              *被放置在第一列對應的主機名。
              *的IP地址和主機名應該由至少一個
              *空間。
              *
              *此外,評論(這樣的)可能是插入的個人
              *線或後機器名稱用“*”符號。
              *
              例如:
              *
              * 102.54.94.97 rhino.acme.com源伺服器
              * 38.25.63.10 x.acme.com x客戶機主機
              *本地主機名稱解析DNS本身處理。
              * 127.0.0.1 localhost
              *::1 localhost
              */
            #endregion
            //使用者
            //部門
            //職位
 
        }
    }