<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文基於的Spring Boot的版本是2.6.7 。
captcha一款超簡單的驗證碼生成,還挺好玩的.還有中文驗證碼,動態驗證碼. 。在專案中pom.xml組態檔中新增依賴,如下:
<!--驗證碼--> <dependency> <groupId>com.github.whvcse</groupId> <artifactId>easy-captcha</artifactId> <version>1.6.2</version> </dependency>
把生成的驗證碼結果儲存到redis快取中,並設定過期時間。
前端通過提交驗證碼和key,其中key就是儲存到redis中的鍵,通過這個鍵獲取到對應的值,再與前端提交的值對比,相同就通過驗證。
由於captcha這款驗證碼提供了好幾種驗證碼方法,有中文驗證碼,動態驗證碼,算術驗證碼等等,新建一個驗證碼每週類存放這幾種驗證碼型別。程式碼如下:
public enum LoginCodeEnum { /** * 算數 */ ARITHMETIC, /** * 中文 */ CHINESE, /** * 中文閃圖 */ CHINESE_GIF, /** * 閃圖 */ GIF, SPEC }
該類是定義驗證碼的基本資訊,例如高度、寬度、字型型別、驗證碼型別等等、並且我們把它轉成通過SpringBoot組態檔型別來定義更加方便。
@Data public class LoginCode { /** * 驗證碼設定 */ private LoginCodeEnum codeType; /** * 驗證碼有效期 分鐘 */ private Long expiration = 2L; /** * 驗證碼內容長度 */ private int length = 2; /** * 驗證碼寬度 */ private int width = 111; /** * 驗證碼高度 */ private int height = 36; /** * 驗證碼字型 */ private String fontName; /** * 字型大小 */ private int fontSize = 25; /** * 驗證碼字首 * @return */ private String codeKey; public LoginCodeEnum getCodeType() { return codeType; } }
把組態檔轉換Pojo類的統一設定類
@Configuration public class ConfigBeanConfiguration { @Bean @ConfigurationProperties(prefix = "login") public LoginProperties loginProperties() { return new LoginProperties(); } }
@Data public class LoginProperties { private LoginCode loginCode; /** * 獲取驗證碼生產類 * @return */ public Captcha getCaptcha(){ if(Objects.isNull(loginCode)){ loginCode = new LoginCode(); if(Objects.isNull(loginCode.getCodeType())){ loginCode.setCodeType(LoginCodeEnum.ARITHMETIC); } } return switchCaptcha(loginCode); } /** * 依據設定資訊生產驗證碼 * @param loginCode * @return */ private Captcha switchCaptcha(LoginCode loginCode){ Captcha captcha = null; synchronized (this){ switch (loginCode.getCodeType()){ case ARITHMETIC: captcha = new FixedArithmeticCaptcha(loginCode.getWidth(),loginCode.getHeight()); captcha.setLen(loginCode.getLength()); break; case CHINESE: captcha = new ChineseCaptcha(loginCode.getWidth(),loginCode.getHeight()); captcha.setLen(loginCode.getLength()); break; case CHINESE_GIF: captcha = new ChineseGifCaptcha(loginCode.getWidth(),loginCode.getHeight()); captcha.setLen(loginCode.getLength()); break; case GIF: captcha = new GifCaptcha(loginCode.getWidth(),loginCode.getHeight()); captcha.setLen(loginCode.getLength()); break; case SPEC: captcha = new SpecCaptcha(loginCode.getWidth(),loginCode.getHeight()); captcha.setLen(loginCode.getLength()); default: System.out.println("驗證碼設定資訊錯誤!正確設定檢視 LoginCodeEnum "); } } if(StringUtils.isNotBlank(loginCode.getFontName())){ captcha.setFont(new Font(loginCode.getFontName(),Font.PLAIN,loginCode.getFontSize())); } return captcha; } static class FixedArithmeticCaptcha extends ArithmeticCaptcha{ public FixedArithmeticCaptcha(int width,int height){ super(width,height); } @Override protected char[] alphas() { // 生成亂數字和運運算元 int n1 = num(1, 10), n2 = num(1, 10); int opt = num(3); // 計算結果 int res = new int[]{n1 + n2, n1 - n2, n1 * n2}[opt]; // 轉換為字元運運算元 char optChar = "+-x".charAt(opt); this.setArithmeticString(String.format("%s%c%s=?", n1, optChar, n2)); this.chars = String.valueOf(res); return chars.toCharArray(); } } }
@ApiOperation(value = "獲取驗證碼", notes = "獲取驗證碼") @GetMapping("/code") public Object getCode(){ Captcha captcha = loginProperties.getCaptcha(); String uuid = "code-key-"+IdUtil.simpleUUID(); //當驗證碼型別為 arithmetic時且長度 >= 2 時,captcha.text()的結果有機率為浮點型 String captchaValue = captcha.text(); if(captcha.getCharType()-1 == LoginCodeEnum.ARITHMETIC.ordinal() && captchaValue.contains(".")){ captchaValue = captchaValue.split("\.")[0]; } // 儲存 redisUtils.set(uuid,captchaValue,loginProperties.getLoginCode().getExpiration(), TimeUnit.MINUTES); // 驗證碼資訊 Map<String,Object> imgResult = new HashMap<String,Object>(2){{ put("img",captcha.toBase64()); put("uuid",uuid); }}; return imgResult; }
<template> <div class="login-code"> <img :src="codeUrl" @click="getCode"> </div> </template> <script> methods: { getCode() { getCodeImg().then(res => { this.codeUrl = res.data.img this.loginForm.uuid = res.data.uuid }) }, } created() { // 獲取驗證碼 this.getCode() }, </script>
到此這篇關於SpringBoot前後端分離實現驗證碼操作的文章就介紹到這了,更多相關SpringBoot驗證碼內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45