## 前言 上兩篇文章分享了過濾器實現JWT進行鑒權,分別是通過授權過濾器和操作過濾器實現,這兩個過濾器也是最常用的。文章鏈接:[授權過濾器—MVC中使用授權過濾器實現JWT許可權認證](https://www.cnblogs.com/wml-it/p/17612434.html),[操作過濾器—MV ...
前言
上兩篇文章分享了過濾器實現JWT進行鑒權,分別是通過授權過濾器和操作過濾器實現,這兩個過濾器也是最常用的。文章鏈接:授權過濾器—MVC中使用授權過濾器實現JWT許可權認證,操作過濾器—MVC中使用操作過濾器實現JWT許可權認證,接下來將簡單的談談資源過濾器在MVC中如何使用,一般項目中這個過濾器很少用到。
一、什麼是資源過濾器?
過濾器(Filter)是 AOP(面向切麵編程) 思想的一種實現,供我們在執行管道的特定階段執行代碼,通過使用過濾器可以實現短路請求、緩存請求結果、日誌統一記錄、參數合法性驗證、異常統一處理、返回值格式化 等等,同時使業務代碼更加簡潔單純,避免很多重覆代碼。所以在我們的過濾器中,大部分過濾器有開始執行action,即ing 狀態的方法,也有action業務代碼執行完後觸發的ed狀態的方法。
資源過濾器在過濾器管道中第二個被執行,通常用於請求結果的緩存和短路過濾器管道,通過實現介面 IResourceFilter 或者IAsyncResourceFilter。和其他過濾器一樣,實現介面,只是介面不同,接收的參數兩類型不同,但是這也正意味著執行的時機不同。接收的參數類型為:ResourceExecutedContext
。
二、資源過濾器實現
資源過濾器定義:
資過濾器的定義,需要實現介面 IResourceFilter 或者IAsyncResourceFilter,接收的參數類型為:ResourceExecutedContext。
/// <summary>
/// 資源過濾器
/// </summary>
public class MyResourceFilter : Attribute, IResourceFilter//過濾器要繼承Attribute 特性,這樣我們也可以當做特性使用
{
/// <summary>
/// 記憶體緩存對象
/// </summary>
private readonly IMemoryCache _memoryCache;
/// <summary>
/// 構造註入
/// </summary>
public MyResourceFilter(IMemoryCache memoryCache)
{
_memoryCache = memoryCache;
}
/// <summary>
/// 資源過濾器過濾器執行之前(befor)
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuted(ResourceExecutedContext context)
{
//針對哪些Action,也可以吧特性標註在Action上
var ad = context.ActionDescriptor;
var str = ad.RouteValues["controller"] + "/" + ad.RouteValues["action"];
if (str != "ResourceFilter/Test")
{
return;
}
//我們可以將當前的結果context.Result緩存起來,當執行ing時,直接返回,為了方便示例演示,我們用時間表示。
string content = "Action第一次執行調用時間:" + DateTime.Now;
var value = _memoryCache.Get("key"); //判斷記憶體中是否有內容,有就直接返回,不再執行action過程。
if (value == null)
{
_memoryCache.Set("key", content);
}
}
/// <summary>
/// 資源過濾器過濾器執行之後(after)
/// </summary>
/// <param name="context"></param>
public void OnResourceExecuting(ResourceExecutingContext context)
{
//針對哪些Action,也可以吧特性標註在Action上
var ad = context.ActionDescriptor;
var str = ad.RouteValues["controller"] + "/" + ad.RouteValues["action"];
if (str != "ResourceFilter/Test")
{
return;
}
var content = _memoryCache.Get("key"); //判斷記憶體中是否有內容,有就直接返回,不再執行action過程。
if (content != null)
{
var result = new { IsSuccess = true, Msg= _memoryCache.Get("key") };
//短路返回,不會再執行Action中方法和OnResourceExecuted方法
context.Result = new ContentResult() { Content = Newtonsoft.Json.JsonConvert.SerializeObject(result) };
};
}
}
添加到全局過濾器:
services.AddMvc(options =>
{
options.Filters.Add<MyResourceFilter>();
});
添加測試Action:
/// <summary>
/// 資源過濾器測試
/// </summary>
public class ResourceFilterController : ControllerBase
{
/// <summary>
/// 記憶體緩存對象
/// </summary>
private readonly IMemoryCache _memoryCache;
/// <summary>
/// 構造註入
/// </summary>
/// <param name="memoryCache"></param>
public ResourceFilterController(IMemoryCache memoryCache)
{
_memoryCache = memoryCache;
}
/// <summary>
/// 資源過濾器測試,獲取介面第一次調用時間
/// 如果第一次調用Action:會進入Action執行方法體
/// 如果不是第一次調用Action:在資源過濾器中直接短路返回第一次調用時間
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult Test()
{
string content = "Action第一次執行調用時間:" + DateTime.Now;
var value = _memoryCache.Get("key"); //判斷記憶體中是否有內容,有就直接返回,不再執行action過程。
if (value == null)
{
_memoryCache.Set("key", content);
}
return Ok(new { IsSuccess = true, Msg = content });
}
}
三、驗證:
第1次調用:
訪問地址:
https://localhost:5001/ResourceFilter/Test
第N次調用:
建群聲明:本著技術在於分享,方便大家交流學習的初心,特此建立【編程內功修煉交流群】,熱烈歡迎各位愛交流學習的程式員進群,也希望進群的大佬能不吝分享自己遇到的技術問題和學習心得!
本文來自博客園,作者:碼農阿亮,轉載請註明原文鏈接:https://www.cnblogs.com/wml-it/p/17622189.html
技術的發展日新月異,隨著時間推移,無法保證本博客所有內容的正確性。如有誤導,請大家見諒,歡迎評論區指正!
開源庫鏈接,歡迎點亮:
GitHub:https://github.com/ITMingliang
Gitee:https://gitee.com/mingliang_it
GitLab:https://gitlab.com/ITMingliang
【編程內功修煉交流群】: 【個人公眾號】: