概要: 若依分离版增加通过邮箱找回密码功能的后端实现
目前通过邮箱修改密码的相关实现,放在注册的Controller,也就是SysRegisterController 里
SysRegisterController代码
@RestController
public class SysRegisterController extends BaseController
{
@Autowired
private ISysUserService userService;
/**
* 发送验证码之前的有效检验方法
*
* @param user 传参信息
* @return 结果
*/
@Anonymous//没有登录也能用
@PostMapping("/sendcode")
public AjaxResult sendcode(@RequestBody RegisterBody user)
{
String msg = "",
userName=user.getUsername(),
userEmail=user.getEamil();
System.out.println("sendcode"+userName+userEmail);
SysUser use= userService.selectUserByUserName(userName);
System.out.println("sendcode"+use);
if(use == null){
msg = "没有该用户";
} else if (!use.getEmail().equals( userEmail) ) {
msg = "用户邮箱输入错误";
}
else{
AjaxResult ajax = AjaxResult.success();
//ajax
}
return StringUtils.isEmpty(msg) ? success() : error(msg);
}
/**
* 发送短信
*/
@Anonymous
@PostMapping("/email")
public AjaxResult sendemail(@RequestBody EmailRequest emailRequest ){
String msg = "";
String email =emailRequest.getEmail();//要发送的邮箱
String code = emailRequest.getCode();//要发送的验证码
System.out.println("sendemail:"+"email="+email+"code="+code);
if (email == null || code == null) {
msg="缺少必需的参数";
}
// 获取当前日期时间
LocalDateTime now = LocalDateTime.now();
// 格式化当前时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedNow = now.format(formatter);
EmailServer emailServer= new EmailServer();
String[] emailbox={email};
String smtp="SMTP 服务器地址";//例如qq的是smtp.qq.com
String from="用来发送信息的邮箱号";
String passwd="授权码";
String subject="【xxxxx】找回密码邮箱验证";//标题
String content="<p>您本次找回密码的邮箱验证码是:</p>\n" +
"<p>"+code+"</p>\n" +
"<p>有效期5分钟,请勿泄露,妥善保管</p>\n"+
"<p>【xxxxxxx】</p>\n【"+
formattedNow +"】";
emailServer.send(emailbox,smtp,from,passwd,subject,content);
return StringUtils.isEmpty(msg) ? success() : error(msg);
}
public static class EmailRequest {
private String email;
private String code;
// Getters and Setters
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
@Anonymous
@PostMapping("/repassword")
public AjaxResult repassWord(@RequestBody RegisterBody user)
{
String msg = "",
userName=user.getUsername(),
password=user.getPassword();
System.out.println("[repassWord]"+userName+password);
String newPassword = SecurityUtils.encryptPassword(password);
if (userService.resetUserPwd(userName, newPassword) > 0)
{
return success();
}
return StringUtils.isEmpty(msg) ? success() : error(msg);
}
}
EmailServer代码
package xxxxx;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Date;
import java.util.Properties;
public class EmailServer {
public void send(String[] emailbox, String smtp, String from, String passwd, String subject, String content) {
try {
Properties props = new Properties();// 也可用Properties props =
// System.getProperties();
props.put("mail.smtp.host", "smtp.sina.cn");// 存储发送邮件服务器的信息
props.put("mail.smtp.auth", "true");// 同时通过验证
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.enable","true");
props.put("mail.smtp.ssl.socketFactory", sf);
Session s = Session.getDefaultInstance(props, null);// 根据属性新建一个邮件会话
s.setDebug(true);
MimeMessage msg = new MimeMessage(s);// 由邮件会话新建一个消息对象
InternetAddress fromAddress = new InternetAddress(from);
msg.setFrom(fromAddress);// 设置发件人
for (int i = 0; i < emailbox.length; i++) {
InternetAddress toAddress = new InternetAddress(emailbox[i]);
msg.addRecipient(Message.RecipientType.BCC, toAddress);
}// //*****//
msg.setSubject(subject);// 设置主题
BodyPart bp = new MimeBodyPart();
bp.setContent(content, "text/html;charset=UTF-8");
Multipart mp = new MimeMultipart();
mp.addBodyPart(bp);
msg.setContent(mp);// 设置信件内容
msg.setSentDate(new Date());// 设置发信时间
msg.saveChanges();// 存储邮件信息
Transport transport = s.getTransport("smtp");
transport.connect(smtp, from, passwd);// 以smtp方式登录邮箱
transport.sendMessage(msg, msg.getAllRecipients());
} catch (Exception ex) {
ex.printStackTrace();
}
;
}
}
改进空间:
代码剥离:将找回密码功能单独放在一个类里
层次剥离:只在Controller里实现了功能,没有分层service和mapper
安全验证:生成验证码,时效判断都应该放在后端;修改密码前缺少一些判断逻辑和对应的msg信息,比如,验证码错误,密码不一致这些应该放在msg里,而不是在前端验证。没有进行密码长度有效校验;
日志调试:应该用log输出参数信息和执行调试
其他
如果一切正常就是看不到接收的邮件,可以在垃圾邮箱里看下,可能是被判定为垃圾邮箱了。
后面看懂框架后有时间再改吧。・゚゚*(>д<)*゚゚・。