.Net集成敏感詞組件的步驟
ToolGood.Words
首先我們要使用的開(kāi)源組件是 ToolGood.Words

通過(guò)簡(jiǎn)單的了解,我們可以知道它可以針對(duì)敏感詞及其拼音、跳詞等變形進(jìn)行檢測(cè),在實(shí)際的應(yīng)用場(chǎng)景中能滿足大部分的需求。
具體的用法在這里不做過(guò)多的介紹,接下來(lái)我們需要做的事情是如何在現(xiàn)有代碼中快速且方便的情況下接入敏感詞組件。很顯然,如果我們按照組件寫(xiě)的示例去操作,會(huì)發(fā)現(xiàn)需要在現(xiàn)有的代碼中進(jìn)行大量重構(gòu)的操作,這顯然會(huì)累垮 VS 。熟悉水弟的朋友首先就會(huì)想到使用 AOP 的方式去優(yōu)化處理。
ValidationAttribute
我們先定義兩個(gè)簡(jiǎn)單的模型來(lái)綁定輸入?yún)?shù),一個(gè)是只要輸入含有敏感詞就會(huì)報(bào)錯(cuò),一個(gè)是只要輸入含有敏感詞就會(huì)把相關(guān)的字符串替換為 * ,代碼如下:
public class MinganCheckInput
{
[MinGanCheck]
public string Text { get; set; }
}
public class MinganReplaceInput
{
[MinGanReplace]
public string Text { get; set; }
}
其中 [MinGanCheck] 和 [MinGanReplace] 是我們定義的特性標(biāo)記,將其繼承 ValidationAttribute,就和我們常用的 [Required] 一樣方便,哪里敏感點(diǎn)哪里。
/// <summary>
/// 敏感詞檢查的特性,一匹配就拋異常
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public class MinGanCheck : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
throw new NotImplementedException();
}
}
/// <summary>
/// 敏感詞替換
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public class MinGanReplace : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
return ValidationResult.Success;
}
}
接下來(lái)就是實(shí)現(xiàn) ValidationAttribute 的功能,如果看過(guò)水弟寫(xiě)過(guò)的 aop 文章,這時(shí)候就不會(huì)直接在校驗(yàn)的方法中直接引入 ToolGood.Words ,這樣會(huì)帶來(lái)很大的耦合,也不便于我們替換為其他的敏感詞組件或服務(wù)。所以我們只要再多一層抽象就可以了。
// 檢查
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
return validationContext.GetService<IMinGanCheckValidator>().IsValid(value, validationContext);
}
// 替換
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
validationContext.GetService<IMinGanReplaceValidator>().IsValid(value, validationContext);
return ValidationResult.Success;
}
接著我們分別實(shí)現(xiàn) IMinGanCheckValidator 和 IMinGanReplaceValidator 的功能,也即檢查和替換功能。
// 檢查
public class MinGanCheckValidator : IMinGanCheckValidator
{
public ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value is string v)
{
if (!String.IsNullOrEmpty(v))
{
// 文字檢查
if (MinGanProvider.Instance.IllegalWordsSearch.ContainsAny(v))
{
return new ValidationResult("存在敏感詞", new[] { validationContext.MemberName });
}
// 檢查拼音
if (MinGanProvider.Instance.IllegalWordsSearch.ContainsAny(WordsHelper.GetPinyin(v)))
{
return new ValidationResult("存在敏感詞",new []{ validationContext.MemberName });
}
// todo:其他變種
}
}
return ValidationResult.Success;
}
}
//替換
public class MinGanReplaceValidator : IMinGanReplaceValidator
{
public void Replace(object value, ValidationContext validationContext)
{
if (value is string v)
{
if (!String.IsNullOrEmpty(v))
{
v = MinGanProvider.Instance.IllegalWordsSearch.Replace(v);
SetPropertyByName(validationContext.ObjectInstance,validationContext.MemberName, v);
}
}
}
static bool SetPropertyByName(Object obj, string name, Object value)
{
var type = obj.GetType();
var prop = type.GetProperty(name, BindingFlags.Public | BindingFlags.Instance);
if (null == prop || !prop.CanWrite) return false;
prop.SetValue(obj, value, null);
return true;
}
}
其中 MinGanProvider.Instance.IllegalWordsSearch 是 ToolGood.Words 中的檢測(cè)類(lèi)單例,這里不詳細(xì)展開(kāi)。這樣我們就有一個(gè)大概能用的敏感詞檢測(cè)組件了,然而在實(shí)際過(guò)程中,我們還需要對(duì)敏感詞進(jìn)行管理,特別是需要實(shí)時(shí)更新敏感詞。
敏感詞熱重載
以 json 配置文件存放敏感詞為例,只需要配置熱重載就行了。
首先是 Program.cs 文件中讓 json 配置文件熱重載。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((builderContext, config) =>
{
config.AddJsonFile("IllegalKeywords.json", optional: false, reloadOnChange: true);// 配置可熱重載
})
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
最后是在 Startup.cs 中文件處理重載事件。
ChangeToken.OnChange(() => Configuration.GetReloadToken(), () =>
{
// 敏感詞重載
var keys= Configuration.GetSection("IllegalKeywords").Get<List<string>>();
if (keys!=null&&keys.Any())
{
var allKeys = new List<string>();
foreach (var k in keys)
{
allKeys.Add(k); // 增加詞匯
allKeys.Add(WordsHelper.ToTraditionalChinese(k)); // 增加繁體
allKeys.Add(WordsHelper.GetPinyin(k)); // 增加拼音
}
IllegalWordsSearch.SetKeywords(allKeys);
}
});
效果


結(jié)語(yǔ)
看到這里,可能有些人已經(jīng)罵罵咧咧退出網(wǎng)站,說(shuō)好的兩分鐘,光是看文章和復(fù)制代碼都需要十幾分鐘。所以為了滿足伸手黨的需求,我寫(xiě)了一個(gè)簡(jiǎn)單的示例,只要把對(duì)應(yīng)文件和代碼復(fù)制到代碼就可以使用了,真的不超過(guò)2分鐘就能實(shí)現(xiàn)敏感詞檢測(cè)。
項(xiàng)目地址:https://github.com/jonechenug/ToolGood.Words.Sample

以上就是.Net集成敏感詞組件的步驟的詳細(xì)內(nèi)容,更多關(guān)于.Net集成敏感詞組件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- C#敏感詞過(guò)濾實(shí)現(xiàn)方法
- .NET 開(kāi)源配置組件 AgileConfig的使用簡(jiǎn)介
- vue3.0搭配.net core實(shí)現(xiàn)文件上傳組件
- ASP.NET Core MVC學(xué)習(xí)之視圖組件(View Component)
- .NET Core 3.0之創(chuàng)建基于Consul的Configuration擴(kuò)展組件
- .net core高吞吐遠(yuǎn)程方法如何調(diào)用組件XRPC詳解
- 詳解.Net Core中的日志組件(Logging)
- 詳解.Net core2.0日志組件Log4net、Nlog簡(jiǎn)單性能測(cè)試
相關(guān)文章
.NetCore利用BlockingCollection實(shí)現(xiàn)簡(jiǎn)易消息隊(duì)列
這篇文章主要介紹了.NetCore利用BlockingCollection實(shí)現(xiàn)簡(jiǎn)易消息隊(duì)列,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
asp.net 文件路徑之獲得虛擬目錄的網(wǎng)站的根目錄
asp.net下獲取文件路徑常用代碼,獲得虛擬目錄的網(wǎng)站的根目錄2012-10-10
Visual Studio 2017 community安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了Visual Studio 2017 community安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09
在?Net7.0?環(huán)境下如何使用?RestSharp?發(fā)送?Http(FromBody和FromForm)請(qǐng)求
這篇文章主要介紹了在?Net7.0?環(huán)境下使用?RestSharp?發(fā)送?Http(FromBody和FromForm)請(qǐng)求,今天,我就兩個(gè)小的知識(shí)點(diǎn),就是通過(guò)使用?RestSharp?訪問(wèn)?WebAPI,提交?FromBody?和?FromForm?兩種方式的數(shù)據(jù),還是有些區(qū)別的,本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友參考下吧2023-09-09
asp.net fileupload 實(shí)現(xiàn)上傳
在vs的視圖模式下,添加上傳組件,以及添加一個(gè)按鈕button,隨后在后置代碼中加入如下信息2009-05-05
.NET Core 微信小程序退款步驟——(統(tǒng)一退款)
這篇文章主要介紹了.NET Core 微信小程序退款步驟——(統(tǒng)一退款),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
asp.net表單提交時(shí)防重復(fù)提交并執(zhí)行前臺(tái)的JS驗(yàn)證
今天遇到這樣的一個(gè)情況,就是用戶重復(fù)提交。當(dāng)然這個(gè)不能怪用戶,只能怪.NET或者服務(wù)器反應(yīng)遲鈍,下面有個(gè)不錯(cuò)的教程,大家可以參考下2013-10-10

