您好,登錄后才能下訂單哦!
小編給大家分享一下.Net中集成敏感詞組件的操作步驟,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
首先我們要使用的開源組件是 ToolGood.Words
通過簡單的了解,我們可以知道它可以針對敏感詞及其拼音、跳詞等變形進行檢測,在實際的應用場景中能滿足大部分的需求。
具體的用法在這里不做過多的介紹,接下來我們需要做的事情是如何在現有代碼中快速且方便的情況下接入敏感詞組件。很顯然,如果我們按照組件寫的示例去操作,會發現需要在現有的代碼中進行大量重構的操作,這顯然會累垮 VS 。熟悉水弟的朋友首先就會想到使用 AOP 的方式去優化處理。
我們先定義兩個簡單的模型來綁定輸入參數,一個是只要輸入含有敏感詞就會報錯,一個是只要輸入含有敏感詞就會把相關的字符串替換為 * ,代碼如下:
public class MinganCheckInput { [MinGanCheck] public string Text { get; set; } } public class MinganReplaceInput { [MinGanReplace] public string Text { get; set; } }
其中 [MinGanCheck] 和 [MinGanReplace] 是我們定義的特性標記,將其繼承 ValidationAttribute,就和我們常用的 [Required] 一樣方便,哪里敏感點哪里。
/// <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; } }
接下來就是實現 ValidationAttribute 的功能,如果看過水弟寫過的 aop 文章,這時候就不會直接在校驗的方法中直接引入 ToolGood.Words ,這樣會帶來很大的耦合,也不便于我們替換為其他的敏感詞組件或服務。所以我們只要再多一層抽象就可以了。
// 檢查 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; }
接著我們分別實現 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 中的檢測類單例,這里不詳細展開。這樣我們就有一個大概能用的敏感詞檢測組件了,然而在實際過程中,我們還需要對敏感詞進行管理,特別是需要實時更新敏感詞。
以 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); } });
看到這里,可能有些人已經罵罵咧咧退出網站,說好的兩分鐘,光是看文章和都需要十幾分鐘。所以為了滿足伸手黨的需求,我寫了一個簡單的示例,只要把對應文件和代碼復制到代碼就可以使用了,真的不超過2分鐘就能實現敏感詞檢測。
項目地址:https://github.com/jonechenug/ToolGood.Words.Sample
以上是“.Net中集成敏感詞組件的操作步驟”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。