验证码需求分析:
1. 生成验证码,点击图片可进行刷新
2. 输入验证码,点击提交,验证用户输入验证码是否正确
项目创建
首先创建项目这里使用的spring boot 3 + jdk17,并引入相关依赖
pom.xml
<properties> <java.version>17</java.version> <hutool.version>5.8.26</hutool.version> </properties> <dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> <optional>true</optional> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> <scope>test</scope> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-devtools</artifactid> <optional>true</optional> </dependency> <dependency> <groupid>cn.hutool</groupid> <artifactid>hutool-captcha</artifactid> </dependency> </dependencies> <dependencymanagement> <dependencies> <dependency> <groupid>cn.hutool</groupid> <artifactid>hutool-bom</artifactid> <version>${hutool.version}</version> <type>pom</type> <!-- 注意这里是import --> <scope>import</scope> </dependency> </dependencies> </dependencymanagement>
import方式的使用说明
如果你想像spring-boot一样引入hutool,再由子模块决定用到哪些模块,你可以在父模块中加入:
<dependencymanagement> <dependencies> <dependency> <groupid>cn.hutool</groupid> <artifactid>hutool-bom</artifactid> <version>${hutool.version}</version> <type>pom</type> <!-- 注意这里是import --> <scope>import</scope> </dependency> </dependencies> </dependencymanagement>
在子模块中就可以引入自己需要的模块了:
<dependency> <groupid>cn.hutool</groupid> <artifactid>hutool-captcha</artifactid> </dependency>
使用import的方式,只会引入hutool-bom内的dependencymanagement的配置,其它配置在这个引用方式下完全不起作用。
exclude方式
如果你引入的模块比较多,但是某几个模块没用,你可以:
<dependencies> <dependency> <groupid>cn.hutool</groupid> <artifactid>hutool-bom</artifactid> <version>${hutool.version}</version> <!-- 加不加这句都能跑,区别只有是否告警 --> <type>pom</type> <exclusions> <exclusion> <groupid>cn.hutool</groupid> <artifactid>hutool-system</artifactid> </exclusion> </exclusions> </dependency> </dependencies>
这个配置会传递依赖hutool-bom内所有dependencies的内容,当前hutool-bom内的dependencies全部设置了version,就意味着在maven resolve的时候hutool-bom内就算存在dependencymanagement也不会产生任何作用。
定义接口:
1. 生成验证码,并返回
2. 校验验证码是否正确
接口定义
1. 生成验证码 [url] get /captcha/getcaptcha [请求参数] [响应] { "uuid": "fc2b40825f20470bb4f5d9868b33856f", "img": "data:image/png;base64,issaxxxxxxxxgg==" } uuid 是为了方便在真实项目使用中做区分
2. 校验验证码是否正确 [url] post /captcha/check [请求参数] {"uuid":"43b4b30bf1134e9f8430507b7babd620","code":""} [响应] { true } 根据用户输入的验证码,校验验证码是否正确,校验成功,返回true;校验失败,返回false
定义 captchacontroller
@slf4j @restcontroller @requestmapping("/captcha") @allargsconstructor public class captchacontroller { private final syscaptchaservice syscaptchaservice; /** * 生成验证码 */ @getmapping("/getcaptcha") public captcharesult getcaptcha(httpsession session) { return syscaptchaservice.getcaptcha(session); } /** * 验证码校验 * * @param param 验证码参数 */ @postmapping("/check") public boolean checkcaptcha(@requestbody captchavalidateparam param, httpsession session) { string uuid = param.getuuid(); string captcha = param.getcode(); if (strutil.isempty(uuid) || strutil.isempty(captcha)) { log.error("验证码参数不能为空"); return false; } log.info("接收到验证码: uuid:{}, 验证码:{}", uuid, captcha); // 参数校验 return syscaptchaservice.validate(uuid, captcha, session); } }
由于当用户输入验证码时,我们需要进行校验,因此,我们需要对生成的验证码进行存储,同时,需要存储验证码的生成时间,以便判断验证码是否超时
public class constants { public static final string captcha_code = "code"; public static final string captcha_uuid = "uuid"; }
- syscaptchaservice
public interface syscaptchaservice { /** * 获取验证码 * * @param session * @return */ captcharesult getcaptcha(httpsession session); /** * 验证码效验 * * @param uuid * @param code * @param session * @return */ boolean validate(string uuid, string code, httpsession session); }
- syscaptchaserviceimpl
@service @requiredargsconstructor @slf4j public class syscaptchaserviceimpl implements syscaptchaservice { private final captchaproperties captchaproperties; private final codegenerator codegenerator; private final font captchafont; @override public captcharesult getcaptcha(httpsession session) { string captchatype = captchaproperties.gettype(); int width = captchaproperties.getwidth(); int height = captchaproperties.getheight(); int interferecount = captchaproperties.getinterferecount(); int codelength = captchaproperties.getcode().getlength(); abstractcaptcha captcha; if (captchatypeenums.circle.name().equalsignorecase(captchatype)) { captcha = captchautil.createcirclecaptcha(width, height, codelength, interferecount); } else if (captchatypeenums.gif.name().equalsignorecase(captchatype)) { captcha = captchautil.creategifcaptcha(width, height, codelength); } else if (captchatypeenums.line.name().equalsignorecase(captchatype)) { captcha = captchautil.createlinecaptcha(width, height, codelength, interferecount); } else if (captchatypeenums.shear.name().equalsignorecase(captchatype)) { captcha = captchautil.createshearcaptcha(width, height, codelength, interferecount); } else { throw new illegalargumentexception("invalid captcha type: " + captchatype); } captcha.setgenerator(codegenerator); captcha.settextalpha(captchaproperties.gettextalpha()); captcha.setfont(captchafont); string code = captcha.getcode(); string imagebase64data = captcha.getimagebase64data(); // 验证码文本缓存至redis,用于登录校验 string uuid = idutil.fastsimpleuuid(); session.setattribute(constants.captcha_code, code); session.setattribute(constants.captcha_uuid, uuid); return captcharesult.builder().img(imagebase64data).uuid(uuid).build(); } @override public boolean validate(string uuid, string code, httpsession session) { // session中获取验证码 string captchacode = (string) session.getattribute(constants.captcha_code); return codegenerator.verify(captchacode, code); }
将用户输入的验证码与存储在 session 中的验证码进行对比,判断其是否相同,若相同且在1min内,则验证成功
前端代码
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>title</title> <style> #app { font-family: avenir, helvetica, arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } #inputcaptcha { height: 30px; vertical-align: middle; } #verificationcodeimg { vertical-align: middle; } #checkcaptcha { height: 40px; width: 100px; border: 1px solid #000; border-radius: 5px; margin-left: 10px; vertical-align: middle; } </style> </head> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script> <body> <div id="app"> <h1>{{ message }}</h1> <input type="text" v-model="inputcaptcha" id="inputcaptcha"> <img id="verificationcodeimg" :src="captchadata.img" alt="验证码" @click="refreshcaptcha" title="看不清?换一张"/> <input type="button" value="提交" id="checkcaptcha" @click="checkcaptcha"> </div> <script type="module"> import {createapp, ref, onmounted} from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js' createapp({ setup() { const message = ref('验证码校验') const inputcaptcha = ref('') const captchadata = ref({ img: '', uuid: '' }) const refreshcaptcha = () => { $.ajax({ url: '/captcha/getcaptcha', type: 'get', success: function (data) { captchadata.value = data } }) } const checkcaptcha = () => { const datafrom = { uuid: captchadata.value.uuid, code: inputcaptcha.value } $.ajax({ url: '/captcha/check', type: 'post', headers: { 'content-type': 'application/json' }, data: json.stringify(datafrom), success: function (data) { if (data) { alert('验证码正确') refreshcaptcha() } else { alert('验证码错误') refreshcaptcha() } } }) } // 页面加载完成后,刷新验证码 onmounted(() => { refreshcaptcha() }) return { message, captchadata, inputcaptcha, refreshcaptcha, checkcaptcha } } }).mount('#app') </script> </body> </html>
验证成功:
验证失败:
为让验证码有多样性,这里将验证的生成放入了application.yml
配置文件中,内容如下:
# 验证码配置 captcha: # 验证码类型 circle-圆圈干扰验证码|gif-gif验证码|line-干扰线验证码|shear-扭曲干扰验证码 type: circle # 验证码宽度 width: 130 # 验证码高度 height: 48 # 验证码干扰元素个数 interfere-count: 2 # 文本透明度(0.0-1.0) text-alpha: 0.8 # 验证码字符配置 code: # 验证码字符类型 math-算术|random-随机字符 type: math # 验证码字符长度,type=算术时,表示运算位数(1:个位数运算 2:十位数运算);type=随机字符时,表示字符个数 length: 1 # 验证码字体 font: # 字体名称 dialog|dialoginput|monospaced|serif|sansserif name: sansserif # 字体样式 0-普通|1-粗体|2-斜体 weight: 1 # 字体大小 size: 20 # 验证码有效期(秒) expire-seconds: 120
以上就是springboot3整合hutool-captcha实现图形验证码的详细内容,更多关于springboot3 hutool-captcha验证码的资料请关注代码网其它相关文章!
发表评论