若依分离版增加通过邮箱找回密码的后端实现

概要: 若依分离版增加通过邮箱找回密码功能的后端实现

目前通过邮箱修改密码的相关实现,放在注册的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输出参数信息和执行调试
其他
如果一切正常就是看不到接收的邮件,可以在垃圾邮箱里看下,可能是被判定为垃圾邮箱了。

后面看懂框架后有时间再改吧。・゚゚*(>д<)*゚゚・。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值