欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

.Net集成敏感詞組件的步驟

 更新時間:2021年05月13日 16:35:01   作者:張蘅水  
現(xiàn)如今大部分服務(wù)都會有用戶輸入,為了服務(wù)的正常運(yùn)行,很多時候不得不針對輸入進(jìn)行敏感詞的檢測、替換。如果人工做這樣的工作,不僅效率低,成本也高。水弟在這里寫了一個讓小編姐姐都覺得快的敏感詞組件接入示例,不需要依賴第三方服務(wù),只需兩分鐘即可享受清爽文字。

ToolGood.Words

首先我們要使用的開源組件是 ToolGood.Words

通過簡單的了解,我們可以知道它可以針對敏感詞及其拼音、跳詞等變形進(jìn)行檢測,在實際的應(yīng)用場景中能滿足大部分的需求。
具體的用法在這里不做過多的介紹,接下來我們需要做的事情是如何在現(xiàn)有代碼中快速且方便的情況下接入敏感詞組件。很顯然,如果我們按照組件寫的示例去操作,會發(fā)現(xiàn)需要在現(xiàn)有的代碼中進(jìn)行大量重構(gòu)的操作,這顯然會累垮 VS 。熟悉水弟的朋友首先就會想到使用 AOP 的方式去優(yōu)化處理。

ValidationAttribute

我們先定義兩個簡單的模型來綁定輸入?yún)?shù),一個是只要輸入含有敏感詞就會報錯,一個是只要輸入含有敏感詞就會把相關(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] 一樣方便,哪里敏感點哪里。

  /// <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;
        }
    }

接下來就是實現(xiàn) ValidationAttribute 的功能,如果看過水弟寫過的 aop 文章,這時候就不會直接在校驗的方法中直接引入 ToolGood.Words ,這樣會帶來很大的耦合,也不便于我們替換為其他的敏感詞組件或服務(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;
        }

接著我們分別實現(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 中的檢測類單例,這里不詳細(xì)展開。這樣我們就有一個大概能用的敏感詞檢測組件了,然而在實際過程中,我們還需要對敏感詞進(jìn)行管理,特別是需要實時更新敏感詞。

敏感詞熱重載

以 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é)語

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

以上就是.Net集成敏感詞組件的步驟的詳細(xì)內(nèi)容,更多關(guān)于.Net集成敏感詞組件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • .NET邏輯分層架構(gòu)總結(jié)

    .NET邏輯分層架構(gòu)總結(jié)

    本人將從另一個角度來解析.NET分層架構(gòu)的真正奧秘。分層,一些技術(shù)功底比較薄弱的程序員聽到分層就會聯(lián)想到三層架構(gòu)(BLL,DAL之類的),其實不是,分層是一個很大的技術(shù)框架思想,三層架構(gòu)只不過是對普通的信息系統(tǒng)來說,將信息的流轉(zhuǎn)通過三層來分解,
    2015-06-06
  • .NET中STAThread的使用詳解

    .NET中STAThread的使用詳解

    這個STA線程模型,在線程內(nèi)加入了訊息幫浦等等機(jī)制,減少開發(fā)人員撰寫窗口程序的工作量
    2013-05-05
  • 詳解ASP.NET Core和ASP.NET Framework共享身份驗證

    詳解ASP.NET Core和ASP.NET Framework共享身份驗證

    本篇文章主要介紹了詳解ASP.NET Core和ASP.NET Framework共享身份驗證 ,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • ASP.NET MVC 4 中的JSON數(shù)據(jù)交互的方法

    ASP.NET MVC 4 中的JSON數(shù)據(jù)交互的方法

    本篇文章主要介紹了ASP.NET MVC 4 中的JSON數(shù)據(jù)交互的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • ASP.NET Core中的對象池化技術(shù)詳解

    ASP.NET Core中的對象池化技術(shù)詳解

    這篇文章主要為大家詳細(xì)介紹了ASP.NET Core中的對象池化技術(shù)的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • .NET CORE HttpClient的使用方法

    .NET CORE HttpClient的使用方法

    這篇文章主要給大家介紹了關(guān)于.NET CORE HttpClient的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用.NET CORE具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 正則方式的自動小偷抓網(wǎng)程序

    正則方式的自動小偷抓網(wǎng)程序

    公司里面有許多數(shù)據(jù)沒人去錄入,做一個抓取網(wǎng)頁的程序,以前做CMS系統(tǒng)的時候涉及過,不過這次的處理HTML上和以前做了些區(qū)別
    2011-11-11
  • 壓縮aspx頁面刪除多余空格的兩種方法

    壓縮aspx頁面刪除多余空格的兩種方法

    這篇文章主要介紹了壓縮aspx頁面移除多余空格的兩種方法,可以在發(fā)布頁面之前壓縮aspx,無須浪費(fèi)web server的cpu,需要的朋友可以參考下
    2014-02-02
  • Repeater事件OnItemCommand取得行內(nèi)控件的方法

    Repeater事件OnItemCommand取得行內(nèi)控件的方法

    這篇文章主要介紹了Repeater事件OnItemCommand取得行內(nèi)控件的方法,有需要的朋友可以參考一下
    2014-01-01
  • ASP.NET4 GridView的四種排序樣式詳解

    ASP.NET4 GridView的四種排序樣式詳解

    Gridview控件擁有很多不同的CSS樣式屬性設(shè)置,包括象CssClass,Font字體,F(xiàn)oreColor,BackColor,BackColor, Width, Height等等,下面為大家介紹下GridView的四種排序樣式
    2014-08-08

最新評論