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

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

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

(0)

相关推荐

  • .net core高吞吐远程方法如何调用组件XRPC详解

    前言 XRPC的目标非常明确,就是给.net core平台实现一个百万级别的远程方法调用RPC通讯组件.它的设计理念和GRPC一样,基于连接复用的机制实现高吞的性能:XRPC采用了HTTP2复用的思想,在协议设计上也类似文本和二进制相结合:在应用层面并没使用消息而是基于接口代理的方式让使用更简便. 协议序列化 XRPC采用了基于文本+二进制相结合的通讯协议,头以文本的方式表现主要是描述请求的位置和附加信息,这样设计的好处就是在实现网关的时候只需要解释头部就能做很好的负载策略.二进制处理并没有像G

  • ASP.NET Core MVC学习之视图组件(View Component)

    1.视图组件介绍 视图组件是 ASP.NET Core MVC 的新特性,类似于局部视图,但它更强大.视图组件不使用模型绑定,并且仅依赖于调用它时所提供的数据. 视图组件特点: 呈块状,而不是整个响应 包括在控制器和视图之间发现的相同的关注点和可测试性优点 可以拥有参数和业务逻辑 通常从布局页面调用 视图组件可以用在任何需要重复逻辑且对局部视图来说过于复杂的情况,例如: 动态导航菜单 标签云(需要查询数据库) 登录面板 购物车 最近发表的文章 典型博客上的侧边栏内容 将在每个页面上呈现的登录面板

  • .NET 开源配置组件 AgileConfig的使用简介

    介绍 在微服务大行其道的今天,系统会被拆分成多个模块,作为单独的服务运行,同时为了集中化管理,我们还需要日志中心,配置中心等,很多开发人员可能更熟悉 ApolloConfig,这个组件功能也很完善,dotnet的客户端也主要是国人在维护和开发,之前公司就是选型的Apollo,而且也在生产环境稳定运行,但是服务端是Java的,而且部署服务端也有些麻烦. 今天主要介绍 AgileConfig,这是一个基于.net core开发的轻量级配置中心,之前跟作者也有过沟通,也很热情帮忙解决问题,它的特点有部

  • 详解.Net Core中的日志组件(Logging)

    1.介绍 Logging组件是微软实现的日志记录组件包括控制台(Console).调试(Debug).事件日志(EventLog)和TraceSource,但是没有实现最常用用的文件记录日志功能(可以用其他第三方的如NLog.Log4Net.之前写过NLog使用的文章). 2.默认配置 新建.Net Core Web Api项目,添加下面代码. [Route("api/[controller]")] public class ValuesController : Controller

  • vue3.0搭配.net core实现文件上传组件

    在开发Web应用程序中,文件上传是经常用到的一个功能. 在Jquery时代,做上传功能,一般找jQuery插件就够了,很少有人去探究上传文件插件到底是怎么做的. 简单列一下我们要做的技术点和功能点 使用技术 客户端使用vue.js 3.0,并使用vue3新增的功能:Composition API ,服务器使用asp.net core 功能点 标签美化 文件预览 文件上传 服务器接收文件 文件选择美化 在标准的html文件选择标签,是十分不美观的.大概就是下图的样子 但是我们的设计师的设计图可不是

  • 详解.Net core2.0日志组件Log4net、Nlog简单性能测试

    .Net core之Log4net.Nlog简单性能测试 比较log4net.nlog的文件写入性能(.netcore环境),涉及代码和配置如有不正确的地方,还请批评指正. 测试环境 开发工具: Vsual Studio 2017 15.3 框架版本: .net core 2.0 操作系统:window10 Enterprise 1703 硬件配置:CPU I3-4170 3.7GHz,内存 8G,固态硬盘 日志组件 log4net 2.0.8 nlog 5.0.0-beta10 测试用例 1.

  • .NET Core 3.0之创建基于Consul的Configuration扩展组件

    经过前面三篇关于.NET Core Configuration的文章之后,本篇文章主要讨论如何扩展一个Configuration组件出来. 了解了Configuration的源码后,再去扩展一个组件就会比较简单,接下来我们将在.NET Core 3.0-preview5的基础上创建一个基于Consul的配置组件. 相信大家对Consul已经比较了解了,很多项目都会使用Consul作为配置中心,此处也不做其他阐述了,主要是讲一下,创建Consul配置扩展的一些思路.使用Consul配置功能时,我们

  • C#敏感词过滤实现方法

    本文实例讲述了C#敏感词过滤实现方法.分享给大家供大家参考.具体如下: 这两天突然想到了敏感词过滤 就结合网上找到的资料自己写了一个,脏字数量700+(效率不是很高 测试在110多KB的情况下比replace快 3-4倍) 测试结果图 单位:秒 代码如下: System.Text.StringBuilder sb = new System.Text.StringBuilder(text.Length); string filterText = "需要过滤的脏字 以|分开"; //脏字

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

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

  • ASP.NET Core 集成 React SPA应用的步骤

    目录 wwwroot\ui ReactUIMiddleware 运行一下 总结 AgileConfig的UI使用react重写快完成了.上次搞定了基于jwt的登录模式(AntDesign Pro + .NET Core 实现基于JWT的登录认证),但是还有点问题.现在使用react重写后,agileconfig成了个确确实实的前后端分离项目.那么其实部署的话要分2个站点部署,把前端build完的静态内容部署在一个网站,把server端也部署在一个站点.然后修改前端的baseURL让spa的api

  • ShardingSphere jdbc集成多数据源的实现步骤

    目录 集成sharding jdbc 1. 引入依赖 2. 配置分表规则 问题 集成多数据源 1. 引入依赖 2. 多数据源配置 3. 增加多数据源配置 4. 使用 总结 最近有个项目的几张表,数量级在千万以上,技术栈是SpringBoot+Mybatis-plus+MySQL.如果使用单表,在进行查询操作,非常耗时,经过一番调研,决定使用分表中间件:ShardingSphere. ShardingSphere今年4月份成为了 Apache 软件基金会的顶级项目,目前支持数据分片.读写分离.多数

  • 如何让apache集成php7.3.5详细步骤

    安装 php 首先安装 php 的压缩包,目前下载地址 解压文件到这个路径下:D:\Program Files\php-7.3.5(自行选择合适的路径).然后将这个路径加入到环境变量 path 中. 然后打开 cmd 运行php -version,输出类似如下,说明安装成功. PHP 7.3.5 (cli) (built: May 1 2019 13:17:17) ( ZTS MSVC15 (Visual C++ 2017) x64 ) Copyright (c) 1997-2018 The P

  • SpringBoot集成Caffeine缓存的实现步骤

    Maven依赖 要开始使用咖啡因Caffeine和Spring Boot,我们首先添加spring-boot-starter-cache和咖啡因Caffeine依赖项: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </depend

  • Spring-Boot 集成Solr客户端的详细步骤

    Solr 是基于 Lucene 的全文检索服务器,可配置.可扩展,并对索引和搜索性能进行了优化.Solr 多用于电子商务网站.门户.论坛这类网站的站内搜索.Solr 可以独立运行在 Jetty.Tomcat 等这些 Servlet 容器中.Solr 索引的实现非常简单,用 POST 方法去向 Solr服务器发送一个描述 Field 及其内容的 JSON 文档,Solr 根据 JSON 文件增删改索引.Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回 JSON 格式的查询结

  • jenkins中如何集成commander应用的完整步骤

    前言 Jenkins 是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动化构建.测试和部署等功能. 最近参加公司的集成测试平台的开发,在开发中遇到了不少问题,两个星期的迭代也即将完成,在这也用这篇博客记录下开发中的问题,供读者参考 公司的应用较多,所以需要了解这几种应用在jenkins中如何做构建,我自己参与的有两种commander的应用,一种是大数据类的,一个是我们服务端架构组的scala应用 1.大数据应用BigData 配置如下: 配

  • Android集成GreenDao数据库的操作步骤

    数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失.保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的,持久化技术则提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换.目前,Android系统中提供了3种方式的数据持久化技术,即文件存储.SharedPreferences存储以及数据库存储.当然,除了这3种方式之外,你还可以将数据保存在手机的SD卡中,不过使用文件.Shared Preferences或数

  • SpringBoot实现过滤敏感词的示例代码

    过滤敏感词 1. 创建一个储存要过滤的敏感词的文本文件 首先创建一个文本文件储存要过滤的敏感词 在下面的工具类中我们会读取这个文本文件,这里提前给出 @PostConstruct // 这个注解表示当容器实例化这个bean(服务启动的时候)之后在调用构造器之后这个方法会自动的调用 public void init(){ try( // 读取写有"敏感词"的文件,getClass表示从程序编译之后的target/classes读配置文件,读之后是字节流 // java7语法,在这里的句子

  • Flutter集成高德地图并添加自定义Maker的实践

    目录 一.进入高德地图开放平台申请Key 二.yaml文件集成插件 目前地图开放平台三大巨头:高德.百度.腾讯基本都支持Flutter插件开发集成.从这里也能看出Flutter的生态在逐渐的完善.下面介绍下在Flutter项目集成高德地图的一些步骤和个人踩得一些坑. 一.进入高德地图开放平台申请Key Android端需要设置发布版本和调试版本SHA1值,这里可以通过AndroidStudio 自带工具获取, 点击会生成调式SHA1值.发布版本同理. 接着我们设置完SHA1值和包名之后点击提交即

随机推荐