【瑞吉外卖】学习笔记-day5:(三)手机验证码登录(用邮件发送代替)
短信發送:
短信服務介紹
目前市面上有很多第三方提供的短信服務,這些第三方短信服務會和各個運營商(移動、聯通、電信)對接,我們只需要注冊成為會員并且按照提供的開發文檔進行調用就可以發送短信。需要說明的是,這些短信服務一般都是收費服務。
常用短信服務:
- 阿里云
- 華為云
- 騰訊云
- 京東
- 夢網
- 樂信
阿里云短信服務-介紹
阿里云短信服務(Short Message Service)是廣大企業客戶快速觸達手機用戶所優選使用的通信能力。調用API或用群發助手,即可發送驗證碼、通知類和營銷類短信;國內驗證短信秒級觸達,到達率最高可達99%;國際/港澳臺短信覆蓋200多個國家和地區,安全穩定,廣受出海企業選用。
應用場景:
- 驗證碼
- 短信通知
- 推廣短信
阿里云短信服務-注冊賬號
阿里云官網:?https://www.aliyun.com/
點擊官網首頁注冊按鈕。
阿里云短信服務-設置短信簽名
注冊成功后,點擊登錄按鈕進行登錄。登錄后進入短信服務頁面:
?
要錢的...了解下就好......?
設置短信簽名:
開通了短信服務之后,進入短信服務管理頁面,選擇國內消息菜單,我們可以在這里添加短信簽名
?
什么是短信簽名?
- 短信簽名是短信發送者的署名,表示發送方的身份
- 我們要調用阿里云短信服務發送短信,簽名是必不可少的部分
添加短信簽名方式
個人申請簽名是有一定的難度的,我們只需要了解一下使用短信簽名的具體流程
設置短信模板:
每一個被設置好的模板有一個短信模板詳情,模板詳情包含了模板的6條信息?
?可以自己添加模板,并且提交后審核
?
設置AccessKey
AccessKey 是訪問阿里云 API 的密鑰,具有賬戶的完全權限,我們要想在后面通過API調用阿里云短信服務的接口發送短信,那么就必須要設置AccessKey。
光標移動到用戶頭像上,在彈出的窗口中點擊【AccessKey管理】︰
?進入到AccessKey的管理界面之后,提示兩個選項:
?我們選擇第二項
區別:
如果選擇的是繼續使用選項,我們創建的是阿里云賬號的AccessKey,是具有賬戶的完全權限,有了這個AccessKey之后,我們就可以通過API調用阿里云服務,不僅是短信服務,其他服務也可以調用。相對來說,并不安全,當前的AccessKey泄露,會影響到當前賬戶的其他云服務。
如果選擇開始使用子用戶AccessKey,可以創建一個子用戶,這個子用戶可以分配比較低的權限,比如僅分配短信發送的權限,不具備操作其他的服務的權限,即使這個AccessKey泄漏了,也不會影響其他的云服務, 相對安全。
后續操作省略......
修改成用QQ郵箱驗證碼登錄:
導入依賴:
<!--mail短信依賴--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency>?resources下的yml添加配置:
spring:mail:host: smtp.qq.com#發送驗證碼的郵箱username: **********@qq.com# 你的QQ郵箱授權碼password: ***********?獲取QQ郵箱授權碼方法:
?
?
在賬戶頁下拉找到POP3/SMTP服務開啟獲得授權碼?
?然后把授權碼編寫到resources下的yml里即可
?代碼開發:
1、Service層的UserService:
import com.baomidou.mybatisplus.extension.service.IService; import com.itheima.reggie.entity.User;public interface UserService extends IService<User> {//發送郵件void sendMsg(String to,String subject,String text); }2、UserServiceImpl實現類
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.itheima.reggie.mapper.UserMapper; import com.itheima.reggie.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Service; import com.itheima.reggie.entity.User;@Service public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {//把yml配置的郵箱號賦值到from@Value("${spring.mail.username}")private String from;//發送郵件需要的對象@Autowiredprivate JavaMailSender javaMailSender;//郵件發送人@Overridepublic void sendMsg(String to, String subject, String text) {//發送簡單郵件,簡單郵件不包括附件等別的SimpleMailMessage message = new SimpleMailMessage();message.setFrom(from);message.setTo(to);message.setSubject(subject);message.setText(text);//發送郵件javaMailSender.send(message);} }3、在攔截器LoginCheckFilter中放行驗證碼請求和登錄請求
4、 UserController代碼:
@RestController @RequestMapping("/user") @Slf4j public class UserController {@Autowiredprivate UserService userService;//獲取驗證碼@PostMapping("/sendMsg")public R<String> sendMsg(HttpSession session, @RequestBody User user){//獲取郵箱號//相當于發送短信定義的String toString email = user.getPhone();String subject = "瑞吉外賣";//StringUtils.isNotEmpty字符串非空判斷if (StringUtils.isNotEmpty(email)) {//發送一個四位數的驗證碼,把驗證碼變成String類型String code = ValidateCodeUtils.generateValidateCode(4).toString();String text = "【瑞吉外賣】您好,您的登錄驗證碼為:" + code + ",請盡快登錄";log.info("驗證碼為:" + code);//發送短信userService.sendMsg(email,subject,text);//將驗證碼保存到session當中session.setAttribute(email,code);return R.success("驗證碼發送成功");}return R.error("驗證碼發送異常,請重新發送");}//登錄@PostMapping("/login")//Map存JSON數據public R<User> login(HttpSession session,@RequestBody Map map){//獲取郵箱,用戶輸入的String phone = map.get("phone").toString();//獲取驗證碼,用戶輸入的String code = map.get("code").toString();//獲取session中保存的驗證碼Object sessionCode = session.getAttribute(phone);//如果session的驗證碼和用戶輸入的驗證碼進行比對,&&同時if (sessionCode != null && sessionCode.equals(code)) {//要是User數據庫沒有這個郵箱則自動注冊,先看看輸入的郵箱是否存在數據庫LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(User::getPhone,phone);//獲得唯一的用戶,因為手機號是唯一的User user = userService.getOne(queryWrapper);//要是User數據庫沒有這個郵箱則自動注冊if (user == null) {user = new User();user.setPhone(phone);user.setStatus(1);//取郵箱的前五位為用戶名user.setName(phone.substring(0,6));userService.save(user);}//不保存這個用戶名就登不上去,因為過濾器需要得到這個user才能放行,程序才知道你登錄了session.setAttribute("user", user.getId());return R.success(user);}return R.error("登錄失敗");} }5、還需要修改前端一些界面
下載此front替換在你的項目即可:
鏈接:https://pan.baidu.com/s/12hbqPHFmcykc6qGJATHAaA?pwd=guiy?
提取碼:guiy
測試時:如果輸入驗證碼后登陸進去了然后馬上閃退回登陸界面,請求都沒問題的話,嘗試著清理瀏覽器緩存試試~
總結
以上是生活随笔為你收集整理的【瑞吉外卖】学习笔记-day5:(三)手机验证码登录(用邮件发送代替)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Java的Windows扫雷游戏的设
- 下一篇: java对接银联商务公众号+服务窗支付(