为了能够通过配置文件(appsettings.json)或通过代码进行背景图片与模板进行配置、可自定义资源类型、自定义验证规则,本节创建一些扩展类,用来实现这些功能。

上一节内容:NET 6 实现滑动验证码(三)、接口

扩展类都放在了Extensions文件夹下

CaptchaBuilderExtensions.cs

CaptchaBuilderExtensions.cs实现了自定义提供验证码背景图片资源或模板资源、自定义实现资源类型、替换默认验证规则、禁用默认凹槽模板

using SlideCaptcha;
using SlideCaptcha.Interface;
using SlideCaptcha.Resources.Provider;
using System.Linq; namespace Microsoft.Extensions.DependencyInjection
{
public static class CaptchaBuilderExtensions
{
/// <summary>
/// 自定义提供验证码背景图片资源或模板资源
/// </summary>
/// <typeparam name="TProvider">自定义实现</typeparam>
/// <param name="builder"></param>
/// <returns></returns>
public static CaptchaBuilder AddResourceProvider<TProvider>(this CaptchaBuilder builder) where TProvider : class, IResourceProvider
{
builder.Services.AddSingleton<IResourceProvider, TProvider>();
return builder;
}
/// <summary>
/// 自定义实现资源类型
/// </summary>
/// <typeparam name="THandler">自定义实现</typeparam>
/// <param name="builder"></param>
/// <returns></returns>
public static CaptchaBuilder AddResourceHandler<THandler>(this CaptchaBuilder builder) where THandler : class, IResourceHandler
{
builder.Services.AddSingleton<IResourceHandler, THandler>();
return builder;
}
/// <summary>
/// 替换默认的验证规则
/// </summary>
/// <typeparam name="TValidator">自定义验证规则</typeparam>
/// <param name="builder"></param>
/// <returns></returns>
public static CaptchaBuilder ReplaceValidator<TValidator>(this CaptchaBuilder builder) where TValidator : class, IValidator
{
builder.Services.Replace<IValidator, TValidator>();
return builder;
}
/// <summary>
/// 禁用默认凹槽模板
/// </summary>
/// <param name="builder"></param>
/// <returns></returns>
public static CaptchaBuilder DisableDefaultTemplates(this CaptchaBuilder builder)
{
var serviceDescriptor = builder.Services.FirstOrDefault(e => e.ImplementationType == typeof(EmbeddedResourceProvider));
if (serviceDescriptor != null)
{
builder.Services.Remove(serviceDescriptor);
} return builder;
}
}
}

CaptchaServiceCollectionExtensions.cs

CaptchaServiceCollectionExtensions.cs为自动注入必要的接口

using Microsoft.Extensions.Configuration;
using SlideCaptcha;
using SlideCaptcha.Constant;
using SlideCaptcha.Generator;
using SlideCaptcha.Interface;
using SlideCaptcha.Resources;
using SlideCaptcha.Resources.Handler;
using SlideCaptcha.Resources.Provider;
using SlideCaptcha.Storage;
using SlideCaptcha.Validator;
using System; namespace Microsoft.Extensions.DependencyInjection
{
public static class CaptchaServiceCollectionExtensions
{
/// <summary>
/// 依赖注入必要的接口。
/// </summary>
/// <param name="services"></param>
/// <param name="configuration"></param>
/// <param name="optionsAction"></param>
/// <returns></returns>
public static CaptchaBuilder AddSlideCaptcha(this IServiceCollection services, IConfiguration configuration, Action<CaptchaOptions> optionsAction = default)
{
services.Configure<CaptchaOptions>(configuration?.GetSection("SlideCaptcha"));
//对所需验证的参数进行检查,如果参数不合法就抛一个异常出来
if (optionsAction != null) services.PostConfigure(optionsAction); var builder = new CaptchaBuilder(services);
services.AddSingleton<IResourceProvider, OptionsResourceProvider>();
services.AddSingleton<IResourceProvider, EmbeddedResourceProvider>();
services.AddSingleton<IResourceHandlerManager, CachedResourceHandlerManager>();
services.AddSingleton<IResourceManager, DefaultResourceManager>();
services.AddSingleton<ISliderCaptchaImageGenerator, SliderCaptchaImageGenerator>();
services.AddSingleton<IResourceHandler, FileResourceHandler>();
services.AddSingleton<IResourceHandler, EmbeddedResourceHandler>();
services.AddScoped<ICaptcha, ImageCaptcha>();
services.AddScoped<IStorage, DefaultStorage>();
services.AddScoped<IValidator, SimpleValidator>();
return builder;
}
}
}

ServiceCollectionExtensions.cs

ServiceCollectionExtensions.cs用于实现IServiceCollection的Replace方法

using System;
using System.Collections.Generic;
using System.Linq; namespace Microsoft.Extensions.DependencyInjection
{
public static class ServiceCollectionExtensions
{
public static IServiceCollection Replace<TService, TImplementation>(this IServiceCollection services)
where TImplementation : TService
{
return services.Replace<TService>(typeof(TImplementation));
} public static IServiceCollection Replace<TService>(this IServiceCollection services, Type implementationType)
{
return services.Replace(typeof(TService), implementationType);
} public static IServiceCollection Replace(this IServiceCollection services, Type serviceType, Type implementationType)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
} if (serviceType == null)
{
throw new ArgumentNullException(nameof(serviceType));
} if (implementationType == null)
{
throw new ArgumentNullException(nameof(implementationType));
} if (!services.TryGetDescriptors(serviceType, out var descriptors))
{
throw new ArgumentException($"No services found for {serviceType.FullName}.", nameof(serviceType));
} foreach (var descriptor in descriptors)
{
var index = services.IndexOf(descriptor); services.Insert(index, descriptor.WithImplementationType(implementationType)); services.Remove(descriptor);
} return services;
} private static bool TryGetDescriptors(this IServiceCollection services, Type serviceType, out ICollection<ServiceDescriptor> descriptors)
{
return (descriptors = services.Where(service => service.ServiceType == serviceType).ToArray()).Any();
} private static ServiceDescriptor WithImplementationType(this ServiceDescriptor descriptor, Type implementationType)
{
return new ServiceDescriptor(descriptor.ServiceType, implementationType, descriptor.Lifetime);
}
}
}

SlideCaptchaException.cs

SlideCaptchaException.cs 实现自定义异常信息。

using System;

namespace SlideCaptcha.Exceptions
{
public class SlideCaptchaException : Exception
{
public SlideCaptchaException() : base()
{
} public SlideCaptchaException(string message) : base(message)
{
} public SlideCaptchaException(string message, Exception innerException) : base(message, innerException)
{
}
}
}

下载方式:

扫描公众号二维码,或搜索公众号fenxiang3389关注我,回复captcha下载,压缩包包含了验证码类库、服务端API、HTML+JQuery完整代码、vue3组件代码及演示代码!

欢迎大家关注我的微信公众号,一起进步,一起成长

.NET 6 实现滑动验证码(四)、扩展类的更多相关文章

  1. Python——破解极验滑动验证码

    极验滑动验证码 以上图片是最典型的要属于极验滑动认证了,极验官网:http://www.geetest.com/. 现在极验验证码已经更新到了 3.0 版本,截至 2017 年 7 月全球已有十六万家 ...

  2. Python 破解极验滑动验证码

    Python 破解极验滑动验证码 测试开发社区  1周前 阅读目录 极验滑动验证码 实现 位移移动需要的基础知识 对比两张图片,找出缺口 获得图片 按照位移移动 详细代码 回到顶部 极验滑动验证码 以 ...

  3. [Effective Java]第四章 类和接口

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. Thinkphp编辑器扩展类kindeditor用法

    一, 使用前的准备. 使用前请确认你已经建立好了一个Thinkphp站点项目. 1,Keditor.class.php和JSON.class.php 是编辑器扩展类文件,将他们拷贝到你的站点项目的Th ...

  5. thinkphp整合系列之极验滑动验证码

    对于建站的筒子们来说:垃圾广告真是让人深恶痛绝:为了清净:搞个难以识别的验证码吧:又被用户各种吐槽:直到后来出现了极验这个滑动的验证码:这真是一个体验好安全高的方案:官网:http://www.gee ...

  6. vue_drf之实现极验滑动验证码

    一.需求 1,场景 我们在很多登录和注册场景里,为了避免某些恶意攻击程序,我们会添加一些验证码,也就是行为验证,让我们相信现在是一个人在交互,而不是一段爬虫程序.现在市面上用的比较多的,比较流行的是极 ...

  7. PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载

    文章转载自:https://my.oschina.net/junn/blog/104464 PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PH ...

  8. PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 && Linux下的ZipArchive配置开启压缩 &&搞个鸡巴毛,写少了个‘/’号,浪费了一天

    PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启,具体开启方法就不说了,不同的平台开启PHP扩增的方法网上都有,如有 ...

  9. [ios]objective-c中Category类别(扩展类)专题总结

    本文转载至 http://yul100887.blog.163.com/blog/static/20033613520126333344127/   objective-c类别的作用?通过类别的方式, ...

  10. selenium篇之滑动验证码

    一.介绍 现在出现了一种通过用户鼠标移动滑块来填补有缺口图片的验证码,我们叫做滑动验证码.它的原理很简单,首先生成一张图片,然后随机挖去一块,在页面展示被挖去部分的图片,再通过js获取用户滑动距离,以 ...

随机推荐

  1. Ceph分布式存储详述

    存储发展史 企业中使用存储按照其功能,使用场景,一直在持续发展和迭代,大体上可以分为四个阶段: DAS:Direct Attached Storage,即直连存储,第一代存储系统,通过SCSI总线扩展 ...

  2. rpm,docker,k8s三种方式安装部署GitLab服务

    rpm方式 源地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ wget https://mirrors.tuna.tsinghua ...

  3. Beats:在 Beats 中实现动态 pipeline

    转载自:https://blog.csdn.net/UbuntuTouch/article/details/107127197 在我们今天的练习中,我们将使用 Metricbeat 来同时监控 kib ...

  4. 用VS Code搞Qt 6:Gui基础类型——QGuiApplication和QWindow

    在99.996%的情况下,我们弄 Qt 应用都会使用 QApplication 类和 QWidget 类,即直接用 Widgets 库中的组件/控件.为了方便开发人员自己造轮子,Qt 也提供了一套基础 ...

  5. PAT (Basic Level) Practice 1007 素数对猜想 分数 20

    让我们定义dn​为:dn​=pn+1​−pn​,其中pi​是第i个素数.显然有d1​=1,且对于n>1有dn​是偶数."素数对猜想"认为"存在无穷多对相邻且差为2的 ...

  6. [s905l3]性价比神机mgv3000全网首拆,刷armbian实现更多价值!

    最近花55淘了一台mgv3000,s905l3,2+16G带蓝牙,真的性价比没得说 S905L3 工艺28nm差于s905l3a 主频1.9Ghz,超频可以达到2Ghz,GPU是Mail450,当服务 ...

  7. FastJson序列化对象复杂时出错问题解决

    FastJson序列化对象复杂时出错问题解决 针对复杂的对象,如Map<String, List<Map<String, XxxObject<A, B, C>>&g ...

  8. C++ 标准文档

    正式的 C++ 标准文档不是免费的,需要付费购买,可以到 ISO Store 或者其成员国的标准商店购买正版(中国 SACinfo 标准信息服务网,美国 ANSI WebStore,其他成员国可查看 ...

  9. 关于StringBuffer和StringBuilder的使用

    String.StringBuffer.StringBuilder三者的异同? String:不可变的字符序列:底层使用char[]存储 StringBuffer:可变的字符序列:线程安全的,效率低: ...

  10. java集合框架复习----(1)

    文章目录 1 .集合框架思维导图 一.什么是集合 二.collection接口 1 .集合框架思维导图 一.什么是集合 存放在java.util.*.是一个存放对象的容器. 存放的是对象的引用,不是对 ...