[MVC學習筆記]5.使用Controller來代替Filter完成登錄驗證(Session校驗)

来源:http://www.cnblogs.com/JiaoWoWeiZai/archive/2016/09/17/5878027.html
-Advertisement-
Play Games

分別使用Controller和Filter方法完成登錄驗證,對比二者的優劣 ...


      之前的學習中,在對Session校驗完成登錄驗證時,通常使用Filter來處理,方法類似與前文的錯誤日誌過濾,即新建Filter類繼承ActionFilterAttribute類後重寫OnActionExecuting方法,在RegisterGlobalFilters方法中註冊新建的Filter類,之後直接在需要驗證的Action前加上Filter標記即可。

1. 新建登陸校驗類CheckLoginAttribute

using System.Web.Mvc;

namespace PMS.WebApp.Models
{
    public class CheckLoginAttribute:ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            if (filterContext.HttpContext.Session == null || filterContext.HttpContext.Session["user"] == null)
            {
                filterContext.HttpContext.Response.Redirect("/User/Login");
            }
        }
    }
}

2. 註冊登陸校驗類

using System.Web.Mvc;
using PMS.WebApp.Models;

namespace PMS.WebApp
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //filters.Add(new HandleErrorAttribute());
            filters.Add(new Log4ExceptionAttribute());
            filters.Add(new CheckLoginAttribute());
        }
    }
}

3. 在需要校驗的Action增加標記以完成校驗

using System.Web.Mvc;
using PMS.IBLL;
using PMS.WebApp.Models;

namespace PMS.WebApp.Controllers
{
    public class UserController : Controller
    {
        //
        // GET: /User/
        //private IUserService _userService;
        //private IUserService UserService
        //{
        //    get { return _userService ?? (_userService = new UserService()); }
        //    set { _userService = value; }
        //}
        private IUserService UserService { get; set; }
        [CheckLogin]
        public ActionResult Index()
        {
            return Content("OK");
        }

    }
}

      這種方法使用起來過程較為複雜,需要操作多個文件,且效率並不十分高,我們的項目中使用的是一種更為簡單高效的方法:使用Controller進行登錄驗證

1. 新建一個用於驗證的Controller父類,併在其內重寫OnActionExecuting方法完成登陸校驗:

using System.Web.Mvc;

namespace PMS.WebApp.Controllers
{
    public class FilterController : Controller
    {
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            if (Session["user"] == null)
            {
                //filterContext.HttpContext.Response.Redirect("/User/Login");
                filterContext.Result = Redirect("/User/Login");
            }
        }
    }
}

      在Controller校驗類的OnActionExecuting方法中,有如下代碼

//filterContext.HttpContext.Response.Redirect("/User/Login");
filterContext.Result = Redirect("/User/Login");
      我們使用後者而放棄前者的原因是,ASP.NET MVC中規定,Action必須返回ActionResult,如果使用前者,在完成跳轉前會先進入到請求的頁面,這樣不符合我們使用過濾器的初衷。

2. 然後使需要校驗的Controller繼承於我們定義的校驗Controller即可完成全局登錄校驗操作:

using System.Web.Mvc;
using PMS.IBLL;

namespace PMS.WebApp.Controllers
{
    public class UserController : FilterController//Controller
    {
        //
        // GET: /User/
        //private IUserService _userService;
        //private IUserService UserService
        //{
        //    get { return _userService ?? (_userService = new UserService()); }
        //    set { _userService = value; }
        //}
        private IUserService UserService { get; set; }
        //[CheckLogin]
        public ActionResult Index()
        {
            return Content("OK");
        }

    }
}

      下麵我們對比兩種方法的優缺點

      Filter定義過程比較複雜,效率也稍低些,但是卻可以對每一個Action進行單獨的過濾,同一Action也可以有多條過濾信息,使用比較靈活。

      Controller定義更為簡便,效率高,但是卻只能對整個Controller中所有方法進行過濾,同一Controller也不太容易有多個Controller過濾父類。

     綜上所述,實際項目中大多需求都是同一Controller下所有方法都需要完成登陸驗證,所以其實使用Controller過濾更為高效,應對複雜需求時,靈活混用兩種方法也不失為一種好的策略。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 常見錯誤: ORA-00001:違反唯一約束條件(主鍵錯誤) ORA-00028:無法連接資料庫進程ORA-00900:無效sql語句 ORA-00904:欄位名寫錯或是建表時最後一個欄位有逗號 ORA-00907:缺少右括弧 ORA-00911:無效字元ORA-00917:缺少逗號 ORA-009 ...
  • http://pymssql.org/en/latest/pymssql_examples.html Example scripts using pymssql module. Basic features (strict DB-API compliance) from os import gete ...
  • 文本查找 grep,egrep,fgrep grep :Global Research 根據模式搜索文本,並將符合模式的文本行顯示出來 模式:Pattern,文本字元和正則的元字元組合而成匹配條件 grep 'root' /etc/passwd -i :ignore case,忽略大小寫 --col ...
  • 1.安裝git 2.創建用戶與授權 3.git 使用 ...
  • 1.安裝vsftpd 2.配置vsftpd.conf 3.添加ftp用戶 4.上傳許可權 5.設置vsftp 開機啟動 6.添加防火牆 ...
  • 每個人心裡都有一個建站夢,所以今天作為我第一篇文章,就給大家圓了這場夢。 今天我來詳細的一步一步帶領大家利用WordPress程式來建立自己的小站以及解決直接功能變數名稱訪問(本地安裝wordpress請閱讀《本地安裝WordPress》),首先建議大家在跟著我的步驟準備開始的時候先看看我的另一篇文章《Wo ...
  • I/O: 系統設定 預設輸入設備:標準輸入,STDIN,0 預設輸出設備:標準輸出,STDOUT,1 標準錯誤輸出:STDERR,2 屬於不同的數據流 標準輸入:鍵盤 標準輸出和錯誤輸出:顯示器 I/O重定向: 輸出重定向: > :覆蓋輸出 >> :追加輸出 2>:錯誤輸出 2>>:追加錯誤輸出 正 ...
  • ColorConsole htmlagilitypack.1.4.9.5 經測試效率比 CsQueryLaster 高 csvhelper Extend Devlib系列一套 itextsharp litedb log4net microsoft.bcl一套,.net4 await 用 MySql.... ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...