.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è)類單例,這里不詳細(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ō)好的兩分鐘,光是看文章和都需要十幾分鐘。所以為了滿足伸手黨的需求,我寫(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)文章!