一.手機(jī)驗(yàn)證碼登錄實(shí)現(xiàn)
前面是站在后臺員工的角度,現(xiàn)在站在消費(fèi)者的角度,當(dāng)客戶從移動端選擇通過驗(yàn)證碼登錄APP,需要調(diào)用云服務(wù)器的短信功能(廠商短信服務(wù)API),后端要做的就是生成驗(yàn)證碼并發(fā)送,并針對請求中客戶收到的驗(yàn)證碼與后端發(fā)送的進(jìn)行比對,確保一致后成功登錄。
首先針對客戶,建立對應(yīng)的數(shù)據(jù)表:
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL COMMENT '主鍵',
`name` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '姓名',
`phone` varchar(100) COLLATE utf8_bin NOT NULL COMMENT '手機(jī)號',
`sex` varchar(2) COLLATE utf8_bin DEFAULT NULL COMMENT '性別',
`id_number` varchar(18) COLLATE utf8_bin DEFAULT NULL COMMENT '身份證號',
`avatar` varchar(500) COLLATE utf8_bin DEFAULT NULL COMMENT '頭像',
`status` int(11) DEFAULT '0' COMMENT '狀態(tài) 0:禁用,1:正常',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用戶信息';
其次,建立相關(guān)實(shí)體類,創(chuàng)建對應(yīng)的Service、Controller層,編寫Mapper接口,從客戶角度出發(fā),要做的是放行客戶模塊的前端資源,在Filter中設(shè)置過濾的URL,修改MP自動填充功能的配置
攔截器里的處理:
//查看用戶登陸狀態(tài) 如果已登錄 則直接放行
if (!(request.getSession().getAttribute("user") == null)) {
log.info("用戶已登錄!當(dāng)前用戶為:{}", request.getSession().getAttribute("user"));
//通過ThreadLocal獲取Session中的id
BaseContext.setCurrentId((Long) request.getSession().getAttribute("user"));
Long sessionId = BaseContext.getCurrentId();
filterChain.doFilter(request, response);
return;
}
下面,重頭戲來了!
在Controller層中編寫針對用戶手機(jī)號來發(fā)送驗(yàn)證碼的方法,主要就是接收來自前端的手機(jī)號碼
導(dǎo)入依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.23</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.16</version>
</dependency>
調(diào)用服務(wù)器廠商的API(后面短信服務(wù)會生成SKD復(fù)制粘貼后修改參數(shù)即可)針對電話號碼發(fā)送定制的短信,并將驗(yàn)證碼存到Session中來校驗(yàn)登錄
@PostMapping("/sendMsg")
public R<String> sendMsg(@RequestBody User user, HttpSession httpSession) {
//獲取手機(jī)號
String phone = user.getPhone();
if (StringUtils.isNotEmpty(phone)) {
//生成驗(yàn)證碼
String code = ValidateCodeUtils.generateValidateCode(4).toString();
log.info("電話:{},驗(yàn)證碼:{}",phone,code);
//調(diào)用阿里云API發(fā)送短信
SMSUtils.sendMessage("", "", phone, code);
//將生成的驗(yàn)證碼保存到Session中
httpSession.setAttribute(phone, code);
return R.success("短信發(fā)送成功");
}
return R.error("短信發(fā)送失敗");
}
當(dāng)用戶在前端頁面點(diǎn)擊發(fā)送驗(yàn)證碼后,我們根據(jù)傳來的驗(yàn)證碼進(jìn)行登錄:
此時,客戶已經(jīng)接收到短信驗(yàn)證消息,輸入驗(yàn)證碼后點(diǎn)擊進(jìn)行登錄,前端又向我們發(fā)來了請求:
針對此次請求,需要做的就是對用戶輸入的驗(yàn)證碼進(jìn)行校驗(yàn)(在方法體中,可以選擇用Map來封裝)
將<phone,code>封裝到map后,進(jìn)行校驗(yàn),code與Session中的一致則登陸成功,如果根據(jù)phone從user表中查不到數(shù)據(jù)則自動幫他完成注冊(新增用戶信息到表里),反之則登陸失敗
由于前面幾篇文章類似的場景較多,所以這里不做過多解釋。值得注意的是,為了登陸后可以拿到用戶的數(shù)據(jù),此方法里返回User實(shí)體存到Session里。
@PostMapping("/login")
public R<User> login(@RequestBody Map userMap, HttpSession httpSession) {
log.info(userMap.toString());
//獲取手機(jī)號
String phone = userMap.get("phone").toString();
//獲取驗(yàn)證碼
String code = userMap.get("code").toString();
//獲取Session里的驗(yàn)證碼
String sessionCode = httpSession.get("code").toString();
//驗(yàn)證碼比對(頁面提交的code和存在Session里的code進(jìn)行對比)
if (!(phone != null && Objects.equals(code,sessionCode))) {//這里要用equals
//登陸失敗
return R.error("登陸失敗~");
}
//登陸成功
LambdaQueryWrapper<User> userlqw = new LambdaQueryWrapper<>();
userlqw.eq(User::getPhone, phone);
//通過getOne(唯一標(biāo)識)獲得User對象便于以后的注冊存儲
User user = userService.getOne(userlqw);
//判斷當(dāng)前是否為新用戶,是的話自動注冊
if (user == null) {
//注冊
User userNew = new User();
//這里要new一個User并重新賦予它屬性存到表里,因?yàn)閡ser==null
userNew.setPhone(phone);
userNew.setStatus(1);
userService.save(userNew);
httpSession.setAttribute("user",userNew.getId());
return R.success(userNew);
}
httpSession.setAttribute("user",user.getId());
return R.success(user);
}
值得注意的是方法最后的setAttribute(),只有通過他才能將User信息傳到Session中從而通過Filter中的判斷條件文章來源:http://www.zghlxwxcb.cn/news/detail-434067.html
二.阿里云短信發(fā)送服務(wù)操作流程
點(diǎn)擊開始使用子用戶
新建用戶組
創(chuàng)建用戶組
添加權(quán)限
添加短信權(quán)限(直接搜sms)
創(chuàng)建用戶
創(chuàng)建完成后,點(diǎn)擊添加到用戶組
隨后創(chuàng)建Accesskey
創(chuàng)建完成后即可獲得屬于自己的AccessKey,記得妥善保管,不要泄露
進(jìn)入短信服務(wù),并開通
申請簽名,創(chuàng)建模板(個人做項(xiàng)目不推薦,需要上交營業(yè)執(zhí)照)
作為個人(學(xué)生黨)使用我們可以使用測試短信服務(wù),因?yàn)椴恍枰辖徊牧虾妥C明比較方便,至于費(fèi)用方面大家充五塊錢就行
發(fā)起調(diào)用后我們就能收到短信啦
阿里云已經(jīng)給了我們相關(guān)的API在項(xiàng)目中直接調(diào)用即可.文章來源地址http://www.zghlxwxcb.cn/news/detail-434067.html
到了這里,關(guān)于【SpringBoot+MP】阿里云短信測試服務(wù)操作流程、用戶手機(jī)驗(yàn)證碼登錄實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!