在日常開發(fā)過程中捞附,經(jīng)常需要使用到驗(yàn)證碼功能巾乳,在易水風(fēng)蕭通用工具中對(duì)常見的 【圖形驗(yàn)證碼】、【郵箱驗(yàn)證碼】故俐、【短信驗(yàn)證碼】做一個(gè)通用封裝想鹰。在這三種類型的驗(yàn)證碼中,目前僅對(duì)圖形驗(yàn)證碼和郵箱驗(yàn)證碼做了缺省性實(shí)現(xiàn)药版,由于短信驗(yàn)證碼中短信發(fā)送的特殊性辑舷,需要用戶在開發(fā)過程中完成短信發(fā)送功能的具體實(shí)現(xiàn)。
快速啟動(dòng)
- 先引入相關(guān)依賴
<dependency>
<groupId>com.yishuifengxiao.common</groupId>
<artifactId>common-spring-boot-starter</artifactId>
<version>4.1.2</version>
</dependency>
- 將驗(yàn)證碼工具注入到需要使用到驗(yàn)證碼的地方
注入代碼如下:
@Autowired
private CodeProcessorHolder codeProcessorHolder;
圖形驗(yàn)證碼
生成圖形驗(yàn)證碼
在注入一個(gè)驗(yàn)證碼工具后槽片,通過以下代碼即可快速生成一個(gè)圖形驗(yàn)證碼何缓。
具體的示例代碼如下:
@GetMapping("/code/image")
@ResponseBody
public Response<String> image(HttpServletRequest request, HttpServletResponse response){
try {
codeProcessorHolder.findValidateCodeProcessor(CodeType.IMAGE).create(new ServletWebRequest(request,response));
} catch (ValidateException e) {
return Response.error(e.getMessage());
}
return Response.suc();
}
在以上代碼后,用戶即可通過
http://ip:port/code/image?image=唯一的隨機(jī)值
獲取圖形驗(yàn)證碼了还栓。
在上述請(qǐng)求中碌廓,用戶應(yīng)該將image參數(shù)存儲(chǔ)起來,因?yàn)樵谛r?yàn)驗(yàn)證碼時(shí)需要用到剩盒。
驗(yàn)證圖形驗(yàn)證碼
驗(yàn)證圖形驗(yàn)證碼的示例代碼如下:
@GetMapping("/image/validate")
@ResponseBody
public Response<String> validate(HttpServletRequest request, HttpServletResponse response){
try {
codeProcessorHolder.findValidateCodeProcessor(CodeType.IMAGE).validate(new ServletWebRequest(request,response));
} catch (ValidateException e) {
return Response.error(e.getMessage());
}
return Response.suc();
}
用戶在驗(yàn)證圖形驗(yàn)證碼時(shí)谷婆,即可用過
http://ip:port/image/validate?image=唯一的隨機(jī)值&image_code=驗(yàn)證碼內(nèi)容
來判斷驗(yàn)證碼是否正確。
【注意】上述請(qǐng)求中image參數(shù)的值應(yīng)該與請(qǐng)求中圖形驗(yàn)證碼的url中的image參數(shù)的值保持一致辽聊。
特殊提示:對(duì)于前后端部署在一起的單體應(yīng)用纪挎,上述兩個(gè)請(qǐng)求中的image參數(shù)都可以省略掉。
配置參數(shù)
除此之外跟匆,圖形驗(yàn)證碼相關(guān)的配置有
# 驗(yàn)證碼的長(zhǎng)度,默認(rèn)為4
yishuifengxiao.code.image.length=4
# 驗(yàn)證碼的失效時(shí)間异袄,單位秒,默認(rèn)為300s
yishuifengxiao.code.image.expireIn=300
# 驗(yàn)證碼是否包含字母,默認(rèn)包含
yishuifengxiao.code.image.isContainLetter=true
# 驗(yàn)證碼是否包含數(shù)字,默認(rèn)包含
yishuifengxiao.code.image.isContainNumber=true
# 驗(yàn)證碼的請(qǐng)求參數(shù)
yishuifengxiao.code.image.codeKey=image
# 驗(yàn)證碼對(duì)應(yīng)的值的參數(shù)
yishuifengxiao.code.image.codeValue=image_code
# 圖形驗(yàn)證碼的圖形寬度
yishuifengxiao.code.image.width=70
# 圖形驗(yàn)證碼的圖形高度
yishuifengxiao.code.image.height=28
<b>注意:</b>
在生成驗(yàn)證碼和驗(yàn)證驗(yàn)證碼的請(qǐng)求中玛臂,請(qǐng)求參數(shù)中的image
參數(shù)由yishuifengxiao.code.image.codeKey
屬性,image_code
參數(shù)由yishuifengxiao.code.image.codeValue
屬性決定烤蜕。在某些極端情況下封孙,可以通過這兩個(gè)配置修改請(qǐng)求參數(shù)。
如果服務(wù)是部署在阿里云ECS上面讽营,由于阿里云默認(rèn)關(guān)閉了25號(hào)端口虎忌,因此使用默認(rèn)的端口發(fā)送郵件時(shí)會(huì)導(dǎo)致郵件驗(yàn)證碼發(fā)送失敗,因此需要提交工單到阿里云申請(qǐng)開啟25號(hào)端口斑匪,或者使用465端口呐籽。
郵件驗(yàn)證碼
在使用郵箱驗(yàn)證碼時(shí)锋勺,需要先進(jìn)行下述配置:
- 在項(xiàng)目中導(dǎo)入郵件發(fā)送相關(guān)的依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
- 在項(xiàng)目的配置文件中加入郵件發(fā)送相關(guān)的配置屬性
spring.mail.default-encoding=UTF-8
spring.mail.host=郵箱服務(wù)器
spring.mail.username=完整的郵箱地址
spring.mail.password=密碼
spring.mail.port=465
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.connectiontimeout=5000
spring.mail.properties.mail.smtp.timeout=3000
spring.mail.properties.mail.smtp.writetimeout=5000
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.smtp.socketFactory.fallback=false
spring.mail.properties.mail.smtp.socketFactory.port=465
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
如果不加入以上配置蚀瘸,在使用郵件驗(yàn)證碼時(shí)會(huì)提示 【驗(yàn)證碼處理器不存在】,且不能正確發(fā)送郵件驗(yàn)證碼庶橱。
【注意】在阿里云ECS服務(wù)器上贮勃,25端口默認(rèn)是關(guān)閉的,因此最好配置465端口
發(fā)送郵件驗(yàn)證碼
郵件驗(yàn)證碼的發(fā)送代碼與圖形驗(yàn)證碼的發(fā)送方法基本一致苏章,只需要將CodeType.IMAGE
改成CodeType.EMAIL
即可寂嘉。
@GetMapping("/code/email")
@ResponseBody
public Response<String> email(HttpServletRequest request, HttpServletResponse response){
try {
codeProcessorHolder.findValidateCodeProcessor(CodeType.EMAIL).create(new ServletWebRequest(request,response));
} catch (ValidateException e) {
return Response.error(e.getMessage());
}
return Response.suc();
}
加入上述配置以后,即可通過
http://ip:port/code/email?email=目標(biāo)郵箱地址
發(fā)送郵箱驗(yàn)證碼了枫绅。
驗(yàn)證郵箱驗(yàn)證碼
示例代碼如下:
@GetMapping("/email/validate")
@ResponseBody
public Response<String> validate(HttpServletRequest request, HttpServletResponse response){
try {
codeProcessorHolder.findValidateCodeProcessor(CodeType.EMAIL).validate(new ServletWebRequest(request,response));
} catch (ValidateException e) {
return Response.error(e.getMessage());
}
return Response.suc();
}
加入上述配置以后泉孩,即可通過
http://ip:port/email/validate?email=目標(biāo)郵箱地址&email_code=驗(yàn)證碼
來驗(yàn)證了。
配置參數(shù)
除此之外并淋,組件還提供了一些額外的配置
# 驗(yàn)證碼的長(zhǎng)度,默認(rèn)為4
yishuifengxiao.code.email.length=4
# 驗(yàn)證碼的失效時(shí)間寓搬,單位秒,默認(rèn)為1800s
yishuifengxiao.code.email.expireIn=1800
# 驗(yàn)證碼是否包含字母,默認(rèn)包含
yishuifengxiao.code.email.isContainLetter=true
# 驗(yàn)證碼是否包含數(shù)字,默認(rèn)包含
yishuifengxiao.code.email.isContainNumber=true
# 驗(yàn)證碼的請(qǐng)求參數(shù)
yishuifengxiao.code.email.codeKey=email
# 驗(yàn)證碼對(duì)應(yīng)的值的參數(shù)
yishuifengxiao.code.email.codeValue=email_code
類似地县耽,驗(yàn)證碼的請(qǐng)求參數(shù)中的email
參數(shù)由yishuifengxiao.code.email.codeKey
屬性,email_code
參數(shù)由yishuifengxiao.code.email.codeValue
屬性決定句喷。
進(jìn)階配置
在郵件驗(yàn)證碼功能中,組件對(duì)郵箱驗(yàn)證碼做了一個(gè)缺省性實(shí)現(xiàn)兔毙,在用戶對(duì)郵件驗(yàn)證碼的格式有自定義需求時(shí)唾琼,可以通過在spring中注入一個(gè)名為emailCodeSender
的實(shí)例來實(shí)現(xiàn)自己的模板內(nèi)容。
示例代碼如下
@Component("emailCodeSender")
public class EmailCodeSender implements CodeSender<EmailCode> {
@Override
public void send(String target, EmailCode emailCode, CodeType codeType){
//實(shí)現(xiàn)自己的發(fā)送邏輯
}
}
短信驗(yàn)證碼
由于短信驗(yàn)證碼的特殊性澎剥,不同的短信提供商有不同的發(fā)送接口锡溯,因此在使用短信驗(yàn)證碼功能之前,需要完成自己的名為 smsCodeSender
短信發(fā)送器,并將其注入到spring上下文之中哑姚。
示例代碼如下
@Component("smsCodeSender")
public class SmsCodeSender implements CodeSender<SmsCode> {
@Override
public void send(String target, EmailCode emailCode, CodeType codeType){
//實(shí)現(xiàn)自己的發(fā)送邏輯
}
}
發(fā)送短信驗(yàn)證碼
在完成前置配置之后祭饭,即可發(fā)送短信驗(yàn)證碼了。
示例代碼如下
@GetMapping("/code/sms")
@ResponseBody
public Response<String> sms(HttpServletRequest request, HttpServletResponse response){
try {
codeProcessorHolder.findValidateCodeProcessor(CodeType.SMS).create(new ServletWebRequest(request,response));
} catch (ValidateException e) {
return Response.error(e.getMessage());
}
return Response.suc();
}
加入上述配置以后蜻懦,即可通過
http://ip:port/code/sms?phone=目標(biāo)手機(jī)號(hào)
發(fā)送郵箱驗(yàn)證碼了甜癞。
驗(yàn)證短信驗(yàn)證碼
示例代碼如下:
@GetMapping("/sms/validate")
@ResponseBody
public Response<String> validate(HttpServletRequest request, HttpServletResponse response){
try {
codeProcessorHolder.findValidateCodeProcessor(CodeType.SMS).validate(new ServletWebRequest(request,response));
} catch (ValidateException e) {
return Response.error(e.getMessage());
}
return Response.suc();
}
加入上述配置以后,即可通過
http://ip:port/sms/validate?phone=目標(biāo)手機(jī)號(hào)&phone_code=驗(yàn)證碼
來驗(yàn)證了宛乃。
參數(shù)配置
# 驗(yàn)證碼的長(zhǎng)度,默認(rèn)為4
yishuifengxiao.code.sms.length=4
# 驗(yàn)證碼的失效時(shí)間悠咱,單位秒蒸辆,默認(rèn)為300s
yishuifengxiao.code.sms.expireIn=300
# 驗(yàn)證碼是否包含字母,默認(rèn)包含
yishuifengxiao.code.sms.isContainLetter=true
# 驗(yàn)證碼是否包含數(shù)字,默認(rèn)包含
yishuifengxiao.code.sms.isContainNumber=true
# 驗(yàn)證碼的請(qǐng)求參數(shù)
yishuifengxiao.code.sms.codeKey=phone
# 驗(yàn)證碼對(duì)應(yīng)的值的參數(shù)
yishuifengxiao.code.sms.codeValue=phone_code
類似地,驗(yàn)證碼的請(qǐng)求參數(shù)中的phone
參數(shù)由yishuifengxiao.code.sms.codeKey
屬性,phone_code
參數(shù)由yishuifengxiao.code.sms.codeValue
屬性決定析既。
驗(yàn)證碼的更多用法請(qǐng)參見一下資源
資源鏈接
易水公共組件官方文檔地址:http://doc.yishuifengxiao.com
易水公共組件源碼地址:https://gitee.com/zhiyubujian/common-starter
易水風(fēng)蕭個(gè)人博客 http://www.yishuifengxiao.com
相關(guān)博客