18video性欧美19sex,欧美高清videosddfsexhd,性少妇videosexfreexxx片中国,激情五月激情综合五月看花,亚洲人成网77777色在线播放

  • <blockquote id="9bi4d"></blockquote>
    0
    • 聊天消息
    • 系統(tǒng)消息
    • 評論與回復(fù)
    登錄后你可以
    • 下載海量資料
    • 學(xué)習(xí)在線課程
    • 觀看技術(shù)視頻
    • 寫文章/發(fā)帖/加入社區(qū)
    會員中心
    創(chuàng)作中心

    完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

    3天內(nèi)不再提示

    SpringBoot分布式驗證碼登錄方案

    jf_ro2CN3Fa ? 來源:碼畜君 ? 2023-10-12 17:34 ? 次閱讀
    加入交流群
    微信小助手二維碼

    掃碼添加小助手

    加入工程師交流群

    前言

    為了防止世界被破壞,為了守護世界的和平。。。說錯了,重來~

    為了防止驗證系統(tǒng)被暴力破解,很多系統(tǒng)都增加了驗證碼效驗,比較常見的就是圖片二維碼,業(yè)內(nèi)比較安全的是短信驗證碼,當(dāng)然還有一些拼圖驗證碼,加入人工智能的二維碼等等,我們今天的主題就是前后端分離的圖片二維碼登錄方案。

    基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

    • 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
    • 視頻教程:https://doc.iocoder.cn/video/

    前后端未分離的驗證碼登錄方案

    傳統(tǒng)的項目大都是基于session交互的,前后端都在一個項目里面,比如傳統(tǒng)的SSH項目或者一些JSP系統(tǒng),當(dāng)前端頁面觸發(fā)到獲取驗證碼請求,可以將驗證碼里面的信息存在上下文中,所以登錄的時候只需要 用戶名密碼、驗證碼即可。

    驗證碼生成流程如下

    7bb22bda-68d7-11ee-939d-92fbcf53809c.jpg

    登錄驗證流程如下

    7bc315d0-68d7-11ee-939d-92fbcf53809c.jpg

    可以發(fā)現(xiàn),整個登錄流程還是依賴session上下文的,并且由后端調(diào)整頁面。

    基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

    • 項目地址:https://github.com/YunaiV/yudao-cloud
    • 視頻教程:https://doc.iocoder.cn/video/

    前后端分離的驗證碼登錄方案

    隨著系統(tǒng)和業(yè)務(wù)的不停升級,前后端代碼放在一起的項目越來越臃腫,已經(jīng)無法快速迭代和職責(zé)區(qū)分了,于是紛紛投入了前后端分離的懷抱,發(fā)現(xiàn)代碼和職責(zé)分離以后,開發(fā)效率越來越高了,功能迭代還越來越快,但是以前的驗證碼登錄方案就要更改了。

    驗證碼生成流程如下

    7bcd88a8-68d7-11ee-939d-92fbcf53809c.jpg

    對比原來的方案,增加了redis中間件,不再是存在session里面了,但是后面怎么區(qū)分這個驗證碼是這個請求生成的呢?所以我們加入了唯一標識符來區(qū)分

    登錄驗證流程如下

    7bda2694-68d7-11ee-939d-92fbcf53809c.jpg

    可以發(fā)現(xiàn),基于前后端分離的分布式項目登錄方案對比原來,加了一個redis中間件和token返回,不再依賴上下文session,并且頁面調(diào)整也是由后端換到了前端

    動手擼輪子

    基于驗證碼的輪子還是挺多的,本文就以Kaptcha這個項目為例,通過springboot項目集成Kaptcha來實現(xiàn)驗證碼生成和登錄方案。

    Kaptcha介紹

    Kaptcha是一個基于SimpleCaptcha的驗證碼開源項目

    我找的這個輪子是基于SimpleCaptcha二次封裝的,maven依賴如下

    
    <dependency>
    <groupId>com.github.pengglegroupId>
    <artifactId>kaptchaartifactId>
    <version>2.3.2version>
    dependency>
    

    新建項目并加入依賴

    依賴主要有 SpringBoot、Kaptcha、Redis

    pom.xml
    
    <projectxmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    
    <groupId>com.lzpgroupId>
    <artifactId>kaptchaartifactId>
    <version>1.0-SNAPSHOTversion>
    
    <parent>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-parentartifactId>
    <version>2.3.0.RELEASEversion>
    <relativePath/>
    parent>
    
    <dependencies>
    
    <dependency>
    <groupId>com.github.pengglegroupId>
    <artifactId>kaptchaartifactId>
    <version>2.3.2version>
    dependency>
    
    <dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
    dependency>
    
    
    <dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-data-redisartifactId>
    dependency>
    
    
    <dependency>
    <groupId>org.apache.commonsgroupId>
    <artifactId>commons-pool2artifactId>
    dependency>
    
    <dependency>
    <groupId>com.alibabagroupId>
    <artifactId>fastjsonartifactId>
    <version>1.2.3version>
    dependency>
    
    <dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-databindartifactId>
    dependency>
    
    dependencies>
    
    
    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-maven-pluginartifactId>
    plugin>
    plugins>
    build>
    
    project>
    

    Redis配置類RedisConfig

    @Configuration
    publicclassRedisConfig{
    
    @Bean
    publicRedisTemplateredisTemplate(LettuceConnectionFactoryredisConnectionFactory){
    RedisTemplateredisTemplate=newRedisTemplate();
    redisTemplate.setKeySerializer(newStringRedisSerializer());
    redisTemplate.setValueSerializer(newGenericJackson2JsonRedisSerializer());
    redisTemplate.setHashKeySerializer(newStringRedisSerializer());
    redisTemplate.setHashValueSerializer(newGenericJackson2JsonRedisSerializer());
    redisTemplate.setConnectionFactory(redisConnectionFactory);
    returnredisTemplate;
    }
    
    }
    

    驗證碼配置類KaptchaConfig

    @Configuration
    publicclassKaptchaConfig{
    @Bean
    publicDefaultKaptchaproducer(){
    
    DefaultKaptchadefaultKaptcha=newDefaultKaptcha();
    Propertiesproperties=newProperties();
    properties.setProperty("kaptcha.border","no");
    properties.setProperty("kaptcha.border.color","105,179,90");
    properties.setProperty("kaptcha.textproducer.font.color","black");
    properties.setProperty("kaptcha.image.width","110");
    properties.setProperty("kaptcha.image.height","40");
    properties.setProperty("kaptcha.textproducer.char.string","23456789abcdefghkmnpqrstuvwxyzABCDEFGHKMNPRSTUVWXYZ");
    properties.setProperty("kaptcha.textproducer.font.size","30");
    properties.setProperty("kaptcha.textproducer.char.space","3");
    properties.setProperty("kaptcha.session.key","code");
    properties.setProperty("kaptcha.textproducer.char.length","4");
    properties.setProperty("kaptcha.textproducer.font.names","宋體,楷體,微軟雅黑");
    //properties.setProperty("kaptcha.obscurificator.impl","com.xxx");可以重寫實現(xiàn)類
    properties.setProperty("kaptcha.noise.impl","com.google.code.kaptcha.impl.NoNoise");
    Configconfig=newConfig(properties);
    defaultKaptcha.setConfig(config);
    
    returndefaultKaptcha;
    }
    

    驗證碼控制層CaptchaController

    為了方便代碼寫一塊了,講究看

    packagecom.lzp.kaptcha.controller;
    
    importcom.google.code.kaptcha.impl.DefaultKaptcha;
    importcom.lzp.kaptcha.service.CaptchaService;
    importcom.lzp.kaptcha.vo.CaptchaVO;
    importorg.springframework.beans.factory.annotation.Autowired;
    importorg.springframework.web.bind.annotation.GetMapping;
    importorg.springframework.web.bind.annotation.RequestMapping;
    importorg.springframework.web.bind.annotation.ResponseBody;
    importorg.springframework.web.bind.annotation.RestController;
    importsun.misc.BASE64Encoder;
    
    importjavax.imageio.ImageIO;
    importjava.awt.image.BufferedImage;
    importjava.io.ByteArrayOutputStream;
    importjava.io.IOException;
    
    @RestController
    @RequestMapping("/captcha")
    publicclassCaptchaController{
    
    @Autowired
    privateDefaultKaptchaproducer;
    
    @Autowired
    privateCaptchaServicecaptchaService;
    
    @ResponseBody
    @GetMapping("/get")
    publicCaptchaVOgetCaptcha()throwsIOException{
    
    //生成文字驗證碼
    Stringcontent=producer.createText();
    //生成圖片驗證碼
    ByteArrayOutputStreamoutputStream=null;
    BufferedImageimage=producer.createImage(content);
    
    outputStream=newByteArrayOutputStream();
    ImageIO.write(image,"jpg",outputStream);
    //對字節(jié)數(shù)組Base64編碼
    BASE64Encoderencoder=newBASE64Encoder();
    
    Stringstr="data:image/jpeg;base64,";
    Stringbase64Img=str+encoder.encode(outputStream.toByteArray()).replace("
    ","").replace("
    ","");
    
    CaptchaVOcaptchaVO=captchaService.cacheCaptcha(content);
    captchaVO.setBase64Img(base64Img);
    
    returncaptchaVO;
    }
    
    }
    

    驗證碼返回對象CaptchaVO

    packagecom.lzp.kaptcha.vo;
    
    publicclassCaptchaVO{
    /**
    *驗證碼標識符
    */
    privateStringcaptchaKey;
    /**
    *驗證碼過期時間
    */
    privateLongexpire;
    /**
    *base64字符串
    */
    privateStringbase64Img;
    
    publicStringgetCaptchaKey(){
    returncaptchaKey;
    }
    
    publicvoidsetCaptchaKey(StringcaptchaKey){
    this.captchaKey=captchaKey;
    }
    
    publicLonggetExpire(){
    returnexpire;
    }
    
    publicvoidsetExpire(Longexpire){
    this.expire=expire;
    }
    
    publicStringgetBase64Img(){
    returnbase64Img;
    }
    
    publicvoidsetBase64Img(Stringbase64Img){
    this.base64Img=base64Img;
    }
    }
    

    Redis封裝類 RedisUtils

    網(wǎng)上隨意找的,類里面注明來源,將就用,代碼較多就不貼了,文末有代碼獲取

    驗證碼方法層CaptchaService

    packagecom.lzp.kaptcha.service;
    
    importcom.lzp.kaptcha.utils.RedisUtils;
    importcom.lzp.kaptcha.vo.CaptchaVO;
    importorg.springframework.beans.factory.annotation.Autowired;
    importorg.springframework.beans.factory.annotation.Value;
    importorg.springframework.stereotype.Service;
    
    importjava.util.UUID;
    
    @Service
    publicclassCaptchaService{
    
    @Value("${server.session.timeout:300}")
    privateLongtimeout;
    
    @Autowired
    privateRedisUtilsredisUtils;
    
    
    privatefinalStringCAPTCHA_KEY="captcha";
    
    publicCaptchaVOcacheCaptcha(Stringcaptcha){
    //生成一個隨機標識符
    StringcaptchaKey=UUID.randomUUID().toString();
    
    //緩存驗證碼并設(shè)置過期時間
    redisUtils.set(CAPTCHA_KEY.concat(captchaKey),captcha,timeout);
    
    CaptchaVOcaptchaVO=newCaptchaVO();
    captchaVO.setCaptchaKey(captchaKey);
    captchaVO.setExpire(timeout);
    
    returncaptchaVO;
    }
    
    }
    

    用戶登錄對象封裝LoginDTO

    packagecom.lzp.kaptcha.dto;
    
    publicclassLoginDTO{
    
    privateStringuserName;
    
    privateStringpwd;
    
    privateStringcaptchaKey;
    
    privateStringcaptcha;
    
    publicStringgetUserName(){
    returnuserName;
    }
    
    publicvoidsetUserName(StringuserName){
    this.userName=userName;
    }
    
    publicStringgetPwd(){
    returnpwd;
    }
    
    publicvoidsetPwd(Stringpwd){
    this.pwd=pwd;
    }
    
    publicStringgetCaptchaKey(){
    returncaptchaKey;
    }
    
    publicvoidsetCaptchaKey(StringcaptchaKey){
    this.captchaKey=captchaKey;
    }
    
    publicStringgetCaptcha(){
    returncaptcha;
    }
    
    publicvoidsetCaptcha(Stringcaptcha){
    this.captcha=captcha;
    }
    }
    

    登錄控制層UserController

    這塊我寫邏輯代碼了,相信大家都看的懂

    packagecom.lzp.kaptcha.controller;
    
    importcom.lzp.kaptcha.dto.LoginDTO;
    importcom.lzp.kaptcha.utils.RedisUtils;
    importcom.lzp.kaptcha.vo.UserVO;
    importorg.springframework.beans.factory.annotation.Autowired;
    importorg.springframework.web.bind.annotation.PostMapping;
    importorg.springframework.web.bind.annotation.RequestBody;
    importorg.springframework.web.bind.annotation.RequestMapping;
    importorg.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/user")
    publicclassUserController{
    
    @Autowired
    privateRedisUtilsredisUtils;
    
    @PostMapping("/login")
    publicUserVOlogin(@RequestBodyLoginDTOloginDTO){
    Objectcaptch=redisUtils.get(loginDTO.getCaptchaKey());
    if(captch==null){
    //throw驗證碼已過期
    }
    if(!loginDTO.getCaptcha().equals(captch)){
    //throw驗證碼錯誤
    }
    //查詢用戶信息
    
    //判斷用戶是否存在不存在拋出用戶名密碼錯誤
    
    //判斷密碼是否正確,不正確拋出用戶名密碼錯誤
    
    //構(gòu)造返回到前端的用戶對象并封裝信息和生成token
    
    returnnewUserVO();
    }
    }
    

    驗證碼獲取和查看

    7be97284-68d7-11ee-939d-92fbcf53809c.jpg7bf6213c-68d7-11ee-939d-92fbcf53809c.jpg


    聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
    • 代碼
      +關(guān)注

      關(guān)注

      30

      文章

      4927

      瀏覽量

      72497
    • Redis
      +關(guān)注

      關(guān)注

      0

      文章

      390

      瀏覽量

      11946
    • SpringBoot
      +關(guān)注

      關(guān)注

      0

      文章

      175

      瀏覽量

      583

    原文標題:SpringBoot 分布式驗證碼登錄方案

    文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

    收藏 人收藏
    加入交流群
    微信小助手二維碼

    掃碼添加小助手

    加入工程師交流群

      評論

      相關(guān)推薦
      熱點推薦

      用基于gin框架的Go語言來實現(xiàn)手機號發(fā)送短信驗證碼登錄

      現(xiàn)在大多數(shù)app或wap都實現(xiàn)了通過手機號獲取驗證碼進行驗證登錄,下面來看下用go來實現(xiàn)手機號發(fā)送短信驗證碼登錄的過程,基于的框架是gin
      的頭像 發(fā)表于 07-20 09:36 ?5362次閱讀
      用基于gin框架的Go語言來實現(xiàn)手機號發(fā)送短信<b class='flag-5'>驗證碼</b><b class='flag-5'>登錄</b>

      織夢dedecms登陸提示“驗證碼不正確”的完整解決方案

      != $svali)替換為:if( false)然后,在模板dede/templets/login.htm里去掉以下驗證碼的具體HTML代碼:驗證碼: 以上辦法可以解決dedecms登錄時提示
      發(fā)表于 03-10 23:53

      12306圖片驗證碼難倒了誰?

      ,現(xiàn)在不光要靠網(wǎng)速……(還有看人品)下面是摘自網(wǎng)上的新聞:  一次性輸入正確率僅為8%  為了防止搶票軟件破解,鐵道部12306網(wǎng)站不斷將登錄的圖形驗證碼更新,層出不窮的圖形碼讓一些網(wǎng)購車票的旅客
      發(fā)表于 12-08 10:29

      無法驗證郵箱,總是提示驗證碼錯誤,驗證碼明明是正確的。

      `無法驗證郵箱,總是提示驗證碼錯誤,驗證碼明明是正確的。是不是系統(tǒng)的bug?`
      發(fā)表于 05-12 10:41

      平臺是如何高效的破解市面上各家驗證碼平臺的各種形式驗證碼的?

      眾所周知,驗證碼的出現(xiàn)是為了區(qū)分人和機器,但隨著科技的發(fā)展,黑產(chǎn)從業(yè)者的可圖之利增多,驗證碼的戰(zhàn)場也進入了一段破解與抗破解的持久博弈。驗證碼在逐漸復(fù)雜的同時,黑灰產(chǎn)的攻擊手段也不斷提升。本文就從
      發(fā)表于 11-01 15:21

      基于加密短信驗證碼的移動安全支付解決方案

      針對移動支付過程中支付驗證碼容易泄露的問題,提出了基于加密短信息驗證碼的雙因素移動支付系統(tǒng)方案。該方案基于公開密鑰系統(tǒng),使用公鑰基礎(chǔ)設(shè)施/認證機構(gòu)( PKI/CA)的認證方法進行服務(wù)器
      發(fā)表于 11-29 14:40 ?0次下載
      基于加密短信<b class='flag-5'>驗證碼</b>的移動安全支付解決<b class='flag-5'>方案</b>

      SQLyog_12.4.1_帶驗證碼

      SQLyog_12.4.1_帶驗證碼.rar
      發(fā)表于 04-12 21:03 ?22次下載

      驗證碼能保證真的安全嗎?

      驗證碼的世界,竟然……如此觸目驚心! 這年頭,無論支付、注冊、還是登錄各種端口,哪怕是保障用戶安全的諸多舉措
      的頭像 發(fā)表于 06-10 09:31 ?1.2w次閱讀

      以一個真實網(wǎng)站的驗證碼為例,實現(xiàn)了基于一下KNN的驗證碼識別

      很多網(wǎng)站登錄都需要輸入驗證碼,如果要實現(xiàn)自動登錄就不可避免的要識別驗證碼。本文以一個真實網(wǎng)站的驗證碼為例,實現(xiàn)了基于一下KNN的
      的頭像 發(fā)表于 12-24 17:27 ?8355次閱讀

      驗證碼層出不窮?試試這個自動跳過驗證碼的工具

      目前網(wǎng)絡(luò)上越來越多使用驗證碼了,驗證碼的本意是阻止機器刷流量擠占服務(wù)器資源,這本來無可厚非;但是驗證碼已經(jīng)變得越來越過分,別說機器人了,連人也經(jīng)常沒法辨認!這就相當(dāng)煩了,特別是被廣泛使用更多
      的頭像 發(fā)表于 11-15 10:42 ?6723次閱讀

      驗證碼太麻煩,自動跳過驗證碼神器試一試

      目前網(wǎng)絡(luò)上越來越多使用驗證碼了,驗證碼的本意是阻止機器刷流量擠占服務(wù)器資源,這本來無可厚非;但是驗證碼已經(jīng)變得越來越過分,別說機器人了,連人也經(jīng)常沒法辨認! 這就相當(dāng)煩了,特別是被廣泛使用更多
      的頭像 發(fā)表于 11-15 11:15 ?1.1w次閱讀

      爬蟲實現(xiàn)目標網(wǎng)站驗證碼登陸

      在爬蟲訪問目標網(wǎng)站的過程中,很多網(wǎng)站為了避免被惡意訪問,需要設(shè)置驗證碼登錄,這樣是為了避免非人類的訪問。今天我們學(xué)習(xí)下如何使用Python爬蟲實現(xiàn)驗證碼登錄并且將生成的
      發(fā)表于 12-11 15:27 ?2806次閱讀

      帶帶弟弟OCR通用驗證碼識別SDK免費開源版

      在使用爬蟲登錄網(wǎng)站的時候,經(jīng)常輸入用戶名和密碼后會遇到驗證碼,簡單一點的有字母驗證碼,復(fù)雜一點的有滑塊驗證碼,點選文章和點選圖片驗證碼。這些
      的頭像 發(fā)表于 03-30 17:26 ?5681次閱讀

      驗證碼到底在驗證啥?聊一聊驗證碼是怎么為難我們?nèi)祟惖?/a>

      在文章開頭,老狐先給大家玩一個驗證碼的游戲,猜出圖中驗證碼字母。
      的頭像 發(fā)表于 08-12 10:25 ?3455次閱讀
      <b class='flag-5'>驗證碼</b>到底在<b class='flag-5'>驗證</b>啥?聊一聊<b class='flag-5'>驗證碼</b>是怎么為難我們?nèi)祟惖? />    </a>
</div>                              <div   id=

      Java 中驗證碼的使用

      今天我們講一下在 Java 中驗證碼的使用。 驗證碼生成 本效果是利用easy-captcha工具包實現(xiàn),首先需要添加相關(guān)依賴到pom.xml中,代碼如下: com .github.whvcse
      的頭像 發(fā)表于 09-25 11:11 ?1972次閱讀
      Java 中<b class='flag-5'>驗證碼</b>的使用