基于易水公共組件的驗(yàn)證碼使用入門教程

在日常開發(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)

  1. 先引入相關(guān)依賴
<dependency>
    <groupId>com.yishuifengxiao.common</groupId>
    <artifactId>common-spring-boot-starter</artifactId>
    <version>4.1.2</version>
</dependency>
  1. 將驗(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)行下述配置:

  1. 在項(xiàng)目中導(dǎo)入郵件發(fā)送相關(guān)的依賴
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
  1. 在項(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)博客

  1. springboot整合單點(diǎn)登錄sso

  2. 搭建基于易水公共組件的資源服務(wù)器

  3. spring security之獲取當(dāng)前用戶信息

  4. 基于易水公共組件的權(quán)限管理系統(tǒng)

  5. 基于易水公共組件的驗(yàn)證碼快速入門教程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末躬贡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子眼坏,更是在濱河造成了極大的恐慌拂玻,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宰译,死亡現(xiàn)場(chǎng)離奇詭異檐蚜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)沿侈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門闯第,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缀拭,你說我怎么就攤上這事咳短。” “怎么了蛛淋?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵逐样,是天一觀的道長(zhǎng)岗宣。 經(jīng)常有香客問我学歧,道長(zhǎng)饭入,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任诚卸,我火速辦了婚禮葵第,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘合溺。我一直安慰自己卒密,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布棠赛。 她就那樣靜靜地躺著哮奇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睛约。 梳的紋絲不亂的頭發(fā)上鼎俘,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音辩涝,去河邊找鬼贸伐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛怔揩,可吹牛的內(nèi)容都是我干的捉邢。 我是一名探鬼主播脯丝,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼伏伐!你這毒婦竟也來了宠进?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤藐翎,失蹤者是張志新(化名)和其女友劉穎材蹬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吝镣,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堤器,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赤惊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吼旧。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凰锡,死狀恐怖未舟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掂为,我是刑警寧澤裕膀,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站勇哗,受9級(jí)特大地震影響昼扛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜欲诺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一抄谐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扰法,春花似錦蛹含、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至祠锣,卻和暖如春酷窥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伴网。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工蓬推, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人澡腾。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓沸伏,卻偏偏與公主長(zhǎng)得像募逞,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子馋评,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容