为了能够通过配置文件(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. fastapi教程进阶

    一个简单的栗子 from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return ...

  2. @property装饰器和property()函数

    @property装饰器 Python内置的@property装饰器可以把类的方法伪装成属性调用的方式.也就是本来是Foo.func()的调用方法,变成Foo.func的方式. class Peopl ...

  3. (四)JPA - JQPL 实现增删改查

    (一)JPA的快速入门 建议在需要使用时,看看之前的文章,先把环境搭起来. 5.JPQL JPQL和SQL 1.JPQL和SQL很像,查询关键字都是一样的 2.唯一的区别是:JPQL是面向对象的 JP ...

  4. ​打造企业自己代码规范IDEA插件(中)

    一些基本概念 在开始独立研发公司自己的代码规范检查规则之前,先介绍一些相关的基本概念.阿里巴巴代码规范很多规则其实都是基于开源框架PMD进行的研发.PMD用官方的话语介绍来说:PMD是一个源代码分析器 ...

  5. Python实现给图片加水印功能

    前言 最近忙得连轴转,很久没更新博客了,代码倒是没啥写,积累了好些东西,接下来一有时间就来更新吧~ 本文记录使用Python实现给图片添加水印的功能实现过程 先看效果 把公众号的封面作为素材 原图是这 ...

  6. C# 传不定参数

    1 public class MyClass 2 { 3 public static void UseParams(params int[] list) 4 { 5 for (int i = 0; i ...

  7. java.lang.ClassNotFoundException:(新建的servlet无法找到class文件)的报错

    该问题有可能是IDEA的部署没有更新的问题 将out中的 删除,然后重新导入即可

  8. 8.pygame-定时器

    使用定时器添加敌机 游戏启动后,每隔一秒出现一架敌方飞机 每架飞机向屏幕下方飞行,速度各不相同 没加敌机出现的水平位置也不进相同 当敌机从屏幕下方飞出,不会再飞回到屏幕中   定时器 pygame中使 ...

  9. 9.为url添加可选的后缀

    为url添加可选的后缀 在drf的机制中,响应数据的格式不再与单一内容类型连接,可以同时享有json格式或html格式,我们可以为api路径添加格式后缀的支持,使用格式后缀给我们明确指定了给定格式的u ...

  10. 京东云开发者|京东云RDS数据迁移常见场景攻略

    云时代已经来临,云上很多场景下都需要数据的迁移.备份和流转,各大云厂商也大都提供了自己的迁移工具.本文主要介绍京东云数据库为解决用户数据迁移的常见场景所提供的解决方案. 场景一:数据迁移上云 数据迁移 ...