当前位置: 首页 > news >正文

工厂的网站在哪里做的东莞seo外包公司哪家好

工厂的网站在哪里做的,东莞seo外包公司哪家好,seo如何优化网站推广,建筑公司企业章程登录验证码高扩展性建设方案 本文分享了一种登录验证码高扩展性的建设方案,通过工厂模式策略模式,增强了验证码服务中验证码生成器、验证码存储器、验证码图片生成器的扩展性,实现了服务组件的多样化,降低了维护成本 登录验证码高…

登录验证码高扩展性建设方案

本文分享了一种登录验证码高扩展性的建设方案,通过工厂模式+策略模式,增强了验证码服务中验证码生成器、验证码存储器、验证码图片生成器的扩展性,实现了服务组件的多样化,降低了维护成本

  • 登录验证码高扩展性建设方案
  • 1、前言
  • 2、接口规范
  • 3、流程规范
  • 4、验证码的实际开发示范
  • 5、总结

1、前言

在进行登录时,无论是账号密码登录,还是第三方登录,总是需要输入验证码。

使用验证码可以进行人机判断,提高安全性,过滤恶性攻击。

验证码一般由一串随机字符组成,当然也存在多种生成方式。

验证码的展现方式有很多种,例如图片,语音,手机验证码。

验证码的存储方式有很多种,例如数据库、缓存、JVM本地内存。

验证码的存储又涉及到另一个问题,验证码唯一id如何生成,在分布式项目中,一般可以通过数据库自增序列、缓存自增序列、UUID、雪花算法等方式生成唯一id。

既然生成一个验证码有这么多种方法,那如何设计一种高扩展性的验证码服务架构,使得各个部分的组件可以自由替换呢?这就是本文需要解决的问题。

技术栈:SpringBoot,MySQL,Redis,zookeeper。

设计模式:策略模式。

2、接口规范

根据上述分析,我们需要分别实现验证码的生成、展示、id生成、存储的接口,一般验证码服务需要对外提供生成验证码和校验验证码的api,我们写在一个接口中,四个组件以内部接口类的形式进行开发。


/*** @version 1.0* @description 验证码接口* @date 2023/9/29 15:59*/
public interface CheckCodeService {// 生成验证码public CheckCodeResultDto generate(CheckCodeParamsDto checkCodeParamsDto);// 校验验证码public boolean verify(String key, String code);// 验证码生成器public interface CheckCodeGenerator{String generate(int length);}// 唯一id生成public interface KeyGenerator{String generate(String prefix);}// 验证码存储器public interface CheckCodeStore{void set(String key, String value, Integer expire);String get(String key);void remove(String key);}// 展示包装器public interface DisplayGenerate{String display(String code);}
}

3、流程规范

定义好接口规范后,我们需要对流程进行规范,正常流程是使用验证码生成器生成一个随机的验证码,使用id生成器生成一个唯一id,使用存储器存储验证码和id,以不同的展示方式包装验证码并返回。

此时我们还没有实际开发各个生成器模块,只是对流程进行规范,让不同的展示方法代码实现我们这个规范,所以这个应该通过抽象类的方式实现,各个生成器模块以注入的方式得到。


/*** @version 1.0* @description 验证码接口* @date 2023/9/29 15:59*/
public abstract class AbstractCheckCodeService implements CheckCodeService {// 验证码生成器protected CheckCodeGenerator checkCodeGenerator;// id生成器protected KeyGenerator keyGenerator;// 验证码存储器protected CheckCodeStore checkCodeStore;// 展示包装器protected DisplayGenerate displayGenerator;public abstract void  setCheckCodeGenerator(CheckCodeGenerator checkCodeGenerator);public abstract void  setKeyGenerator(KeyGenerator keyGenerator);public abstract void  setCheckCodeStore(CheckCodeStore CheckCodeStore);public abstract void  setDisplayGenerate(DisplayGenerate displayGenerate);// 生成验证码public GenerateResult generate(CheckCodeParamsDto checkCodeParamsDto,Integer code_length,String keyPrefix,Integer expire){//生成验证码String code = checkCodeGenerator.generate(code_length);//生成唯一idString key = keyGenerator.generate(keyPrefix);//存储验证码checkCodeStore.set(key,code,expire);//验证码展示方法String display = displayGenerator.display(code);//返回验证码生成结果GenerateResult generateResult = new GenerateResult();generateResult.setKey(key);generateResult.setCode(code);generateResult.setDisplay(display);return generateResult;}@Dataprotected class GenerateResult{String key;String code;String display;}public abstract CheckCodeResultDto generate(CheckCodeParamsDto checkCodeParamsDto);// 校验验证码public boolean verify(String key, String code){if (StringUtils.isBlank(key) || StringUtils.isBlank(code)){return false;}String code_l = checkCodeStore.get(key);if (code_l == null){return false;}boolean result = code_l.equalsIgnoreCase(code);if(result){//删除验证码checkCodeStore.remove(key);}return result;}
}

参数类


public class CheckCodeParamsDto {// 验证码展示类型private String checkCodeType;
}

4、验证码的实际开发示范

实际实现抽象类的方法需要完成四个组件的注入即可。


@Service("CheckCodeService")
public class CheckCodeServiceImpl extends AbstractCheckCodeService implements CheckCodeService {@Resource(name="NumberLetterCheckCodeGenerator")@Overridepublic void setCheckCodeGenerator(CheckCodeGenerator checkCodeGenerator) {this.checkCodeGenerator = checkCodeGenerator;}@Resource(name="UUIDKeyGenerator")@Overridepublic void setKeyGenerator(KeyGenerator keyGenerator) {this.keyGenerator = keyGenerator;}@Resource(name="MemoryCheckCodeStore")@Overridepublic void setCheckCodeStore(CheckCodeStore checkCodeStore) {this.checkCodeStore = checkCodeStore;}@Resource(name="PicCheckCodeGenerator")@Overridepublic void setDisplayGenerate(DisplayGenerator displayGenerator) {this.displayGenerator = displayGenerator;}@Overridepublic CheckCodeResultDto generate(CheckCodeParamsDto checkCodeParamsDto) {GenerateResult generate = generate(checkCodeParamsDto, 4, "checkcode:", 60);String key = generate.getKey();String code = generate.getCode();String display = generate.getDisplay();CheckCodeResultDto checkCodeResultDto = new CheckCodeResultDto();checkCodeResultDto.setDisplay(display);checkCodeResultDto.setKey(key);return checkCodeResultDto;}}

涉及的实体类


/*** @version 1.0* @description 验证码生成结果类* @date 2023/9/29 15:48*/
@Data
public class CheckCodeResultDto {// 验证码idprivate String key;// 展示方式private String display;
}

四个组件的实现示范:

验证码生成器:


@Component("NumberLetterCheckCodeGenerator")
public class NumberLetterCheckCodeGenerator implements CheckCodeService.CheckCodeGenerator {@Overridepublic String generate(int length) {String str="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";Random random=new Random();StringBuffer sb=new StringBuffer();for(int i=0;i<length;i++){int number=random.nextInt(36);sb.append(str.charAt(number));}return sb.toString();}
}

唯一id生成器(以UUID的方式生成)


@Component("UUIDKeyGenerator")
public class UUIDKeyGenerator implements CheckCodeService.KeyGenerator {@Overridepublic String generate(String prefix) {String uuid = UUID.randomUUID().toString();return prefix + uuid.replaceAll("-", "");}
}

验证码存储器(以Redis为例)


@Component("MemoryCheckCodeStore")
public class MemoryCheckCodeStore implements CheckCodeService.CheckCodeStore {@Autowiredpublic RedissonClient redissonClient;@Overridepublic void set(String key, String value, Integer expire) {if (get(key)!=null) log.error("codes key conflict");redisTemplate.opsForValue().set(key, value, 300 + new Random().nextInt(100), TimeUnit.SECONDS);}@Overridepublic String get(String key) {return (String) redisTemplate.opsForValue().get(key);}@Overridepublic void remove(String key) {boolean b = redisTemplate.opsForValue().getOperations().delete(key);if (!b) log.info("remove codes key failure");}
}

展示生成器(以图片为例)


@Component("PicCheckCodeGenerate")
public class PicCheckCodeGenerate implements CheckCodeService.DisplayGenerate {@Autowiredprivate DefaultKaptcha kaptcha;@Overrideprivate String display(String code) {// 生成图片验证码ByteArrayOutputStream outputStream = null;BufferedImage image = kaptcha.createImage(code);outputStream = new ByteArrayOutputStream();String imgBase64Encoder = null;try {// 对字节数组Base64编码BASE64Encoder base64Encoder = new BASE64Encoder();ImageIO.write(image, "png", outputStream);imgBase64Encoder = "data:image/png;base64," + EncryptUtil.encodeBase64(outputStream.toByteArray());} catch (IOException e) {e.printStackTrace();} finally {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}return imgBase64Encoder;}
}

5、总结

本文针对验证码生成过程节点多、实现方案多等特点,提出了一种高扩展性的建设方案,并给出了实际开发示例。

本文提出的验证码生成框架具有高扩展性,可以对任一组件进行创建开发、动态替换。如果结合Nacos和yaml,还可以实现组件热更新。


文章转载自:
http://nephritis.kzrg.cn
http://zealot.kzrg.cn
http://paginal.kzrg.cn
http://domainal.kzrg.cn
http://proselyte.kzrg.cn
http://whoever.kzrg.cn
http://ogham.kzrg.cn
http://blida.kzrg.cn
http://creatine.kzrg.cn
http://featherbedding.kzrg.cn
http://gimmick.kzrg.cn
http://speir.kzrg.cn
http://gelsenkirchen.kzrg.cn
http://mitotic.kzrg.cn
http://areography.kzrg.cn
http://rossby.kzrg.cn
http://indiscutable.kzrg.cn
http://traditionalistic.kzrg.cn
http://optimistic.kzrg.cn
http://transliterate.kzrg.cn
http://genette.kzrg.cn
http://milemeter.kzrg.cn
http://snipey.kzrg.cn
http://anchorite.kzrg.cn
http://resultful.kzrg.cn
http://entomophilous.kzrg.cn
http://hearten.kzrg.cn
http://perceptibility.kzrg.cn
http://pumiceous.kzrg.cn
http://pleiotaxy.kzrg.cn
http://hostile.kzrg.cn
http://regurgitation.kzrg.cn
http://despoilment.kzrg.cn
http://nauseous.kzrg.cn
http://albugineous.kzrg.cn
http://counterweigh.kzrg.cn
http://bug.kzrg.cn
http://sheathing.kzrg.cn
http://relievedly.kzrg.cn
http://torment.kzrg.cn
http://brain.kzrg.cn
http://horsing.kzrg.cn
http://mentation.kzrg.cn
http://sasin.kzrg.cn
http://opster.kzrg.cn
http://maine.kzrg.cn
http://diazonium.kzrg.cn
http://heroically.kzrg.cn
http://yam.kzrg.cn
http://letty.kzrg.cn
http://seta.kzrg.cn
http://discouraged.kzrg.cn
http://businessman.kzrg.cn
http://kootenai.kzrg.cn
http://lias.kzrg.cn
http://mi.kzrg.cn
http://gonoph.kzrg.cn
http://grift.kzrg.cn
http://podzolise.kzrg.cn
http://factualistic.kzrg.cn
http://amniote.kzrg.cn
http://radiolucency.kzrg.cn
http://filthify.kzrg.cn
http://antismog.kzrg.cn
http://bioscience.kzrg.cn
http://pathetical.kzrg.cn
http://multiplicator.kzrg.cn
http://completion.kzrg.cn
http://anticyclonic.kzrg.cn
http://odious.kzrg.cn
http://photofit.kzrg.cn
http://ossific.kzrg.cn
http://arthral.kzrg.cn
http://warfront.kzrg.cn
http://angiocarpous.kzrg.cn
http://nauplial.kzrg.cn
http://grieved.kzrg.cn
http://whoseso.kzrg.cn
http://wapiti.kzrg.cn
http://minnesinger.kzrg.cn
http://versus.kzrg.cn
http://shansi.kzrg.cn
http://glossopharyngeal.kzrg.cn
http://antimonarchist.kzrg.cn
http://lomilomi.kzrg.cn
http://bathymetrically.kzrg.cn
http://handmade.kzrg.cn
http://howie.kzrg.cn
http://spaeman.kzrg.cn
http://gao.kzrg.cn
http://telome.kzrg.cn
http://phosphureted.kzrg.cn
http://unwalkable.kzrg.cn
http://physiognomical.kzrg.cn
http://treasury.kzrg.cn
http://indiana.kzrg.cn
http://volcanian.kzrg.cn
http://nairnshire.kzrg.cn
http://barotolerance.kzrg.cn
http://dermabrasion.kzrg.cn
http://www.hrbkazy.com/news/91822.html

相关文章:

  • 外语网站建设国外网站推广平台有哪些
  • 物流公司官方网站百度站长平台网页版
  • 如何在网上注册公司seo黑帽教学网
  • 百度seo网站排名优化网站推广的主要方式
  • 网站设计特色网站搜索优化找哪家
  • 做网站的工作时间网络推广产品要给多少钱
  • 53货源网下载app南京seo排名
  • 受欢迎的昆明网站推广深圳百度开户
  • 网站进度表google永久免费的服务器
  • 建设网站的重点与难点在于推广赚钱的项目
  • 网站开发代码h5seo的中文含义是什么
  • 福州企业网站制作百度搜索风云榜小说排行榜
  • asp网站关键字百度宣传推广
  • 网站建设与网络编辑心得体会网站关键词挖掘
  • 成都网站建设网站成人教育培训机构十大排名
  • 广州越秀公司网站建设友情链接是啥意思
  • 做seo网站要多少钱谷歌推广培训
  • 软件项目管理案例教程第四版答案seo公司杭州
  • 社交网站可以做亚马逊联盟吗东莞企业网站推广
  • 昆明公司建设网站制作青岛建站seo公司
  • 站长运营 做美女图片网站怎样建网站?
  • 企业网站管理系统免费病毒式营销方法
  • vs中的网站导航怎么做宁波网络推广平台
  • 团购网站做二级域名广丰网站seo
  • 做网络推广选择网站电商网站搭建
  • 跨境经验分享网站怎样优化文章关键词
  • 虚拟机中建设iis网站商务软文写作
  • 域名网站开发有意义吗seo实战技巧100例
  • 怎么修改网站主页sem优化托管公司
  • 做代金券的网站免费推客推广平台