华域联盟 .Net .Net集成敏感词组件的步骤

.Net集成敏感词组件的步骤

.Net集成敏感词组件的步骤
 更新时间:2021年05月13日 16:35:01   作者:张蘅水  

现如今大部分服务都会有用户输入,为了服务的正常运行,很多时候不得不针对输入进行敏感词的检测、替换。如果人工做这样的工作,不仅效率低,成本也高。水弟在这里写了一个让小编姐姐都觉得快的敏感词组件接入示例,不需要依赖第三方服务,只需两分钟即可享受清爽文字。

目录ToolGood.Words
ValidationAttribute
敏感词热重载
效果结语
ToolGood.Words

首先我们要使用的开源组件是 ToolGood.Words

通过简单的了解,我们可以知道它可以针对敏感词及其拼音、跳词等变形进行检测,在实际的应用场景中能满足大部分的需求。
具体的用法在这里不做过多的介绍,接下来我们需要做的事情是如何在现有代码中快速且方便的情况下接入敏感词组件。很显然,如果我们按照组件写的示例去操作,会发现需要在现有的代码中进行大量重构的操作,这显然会累垮 VS 。熟悉水弟的朋友首先就会想到使用 AOP 的方式去优化处理。
ValidationAttribute

我们先定义两个简单的模型来绑定输入参数,一个是只要输入含有敏感词就会报错,一个是只要输入含有敏感词就会把相关的字符串替换为 * ,代码如下:

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分钟就能实现敏感词检测。
项目地址:github.com/jonechenug/ToolGood.Words.Sample

以上就是.Net集成敏感词组件的步骤的详细内容,更多关于.Net集成敏感词组件的资料请关注华域联盟其它相关文章!

您可能感兴趣的文章:C#敏感词过滤实现方法.NET 开源配置组件 AgileConfig的使用简介vue3.0搭配.net core实现文件上传组件ASP.NET Core MVC学习之视图组件(View Component).NET Core 3.0之创建基于Consul的Configuration扩展组件.net core高吞吐远程方法如何调用组件XRPC详解详解.Net Core中的日志组件(Logging)详解.Net core2.0日志组件Log4net、Nlog简单性能测试

.Net
敏感词

相关文章
Visual Studio 2017+OpenCV环境搭建教程这篇文章主要为大家详细介绍了Visual Studio 2017+OpenCV环境搭建教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 2017-03-03
c#.net中const和readonly的区别readonly修饰符用来表示只读,const用来表示不变常量。顾名思义,只读表示不能进行写操作;不变常量不能被修改。这两者到底有什么区别呢 2013-09-09
Aspose.Cells组件导出excel文件这篇文章主要介绍了利用Aspose.Cells组件导出excel文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 2018-12-12
C#读取中文字符及清空缓冲区的实现代码有一个txt的中英文语料库文件,内容是英文一句中文一句相间的,共3000行,需要把英文句和中文句分开,放在单独的txt文件中。 2010-12-12
详解.net core下如何简单构建高可用服务集群一说到集群服务相信对普通开发者来说肯定想到很复杂的事情,这篇文章主要介绍了详解.net core下如何简单构建高可用服务集群,需要的朋友们下面随着小编来一起学习学习吧 2019-01-01
list泛型自定义排序示例这篇文章主要介绍了list泛型自定义排序示例,实现List泛型类将制定元素至前排序,大家参考使用吧 2014-01-01
asp.net core集成CKEditor实现图片上传功能的示例代码这篇文章主要介绍了asp.net core集成CKEditor实现图片上传功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 2021-01-01
asp.net下利用JS实现对后台CS代码的调用方法asp.net下利用JS实现对后台CS代码的调用方法... 2007-04-04
asp.net 开发的一些常用技巧asp.net开发过程中,发现的一些不错技巧,能用的到的朋友有福了。 2009-07-07
.Net 项目代码风格要求小结代码风格没有正确与否,重要的是整齐划一,这是我拟的一份《.Net 项目代码风格要求》,供大家参考 2015-12-12

最新评论

本文由 华域联盟 原创撰写:华域联盟 » .Net集成敏感词组件的步骤

转载请保留出处和原文链接:https://www.cnhackhy.com/4910.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者:

上一篇

已经没有了

发表评论

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: admin@cnhackhy.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部