springboot使用qq邮箱进行注册登录

springboot使用qq邮箱进行注册登录

设计依赖

springboot
mybatis-plus
json数据
MySQL8
lombok

先打开qq邮箱权限记住验证key
在这里插入图片描述

先为登录方式,先进行qq邮箱验证码的发送
获取的code输入表单在输入信息进行注册
将qq邮箱号保存到数据库
登录进行验证qq邮箱号与密码

在这里插入图片描述

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.xuda.msm</groupId>
    <artifactId>emailmsm</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>emailmsm</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <!--springboot的web启动依赖-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <!--lombok-->
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <!--MySQL依赖-->
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <!--mybatis-plus启动依赖-->
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <!--springboot启动依赖-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <!--meil发送启动依赖-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置文件


#appliction.properties配置
#邮箱配置
#平台地址
spring.mail.host=smtp.qq.com
#使用自己的邮箱
spring.mail.username=1375595011@qq.com
#授权码
spring.mail.password=个人权限key输入
spring.mail.properties.mail.smtp.ssl.enable=ture
#编码格式
spring.mail.default-encoding=UTF-8

#数据库配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库地址
spring.datasource.url=jdbc:mysql://localhost:3306/chat?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false
#账号密码
spring.datasource.username=root
spring.datasource.password=123456
spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.web.resources.static-locations=classpath:/static/


实体类

package com.xuda.msm.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * @author :程序员徐大大
 * @description:TODO
 * @date :2022-04-24 18:22
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
    private Integer id;
    private String username;
    private String email;
    private String password;
}

mapper层

package com.xuda.msm.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xuda.msm.entity.User;
import org.springframework.stereotype.Repository;

/**
 * @author :程序员徐大大
 * @description:TODO
 * @date :2022-04-24 18:25
 */
@Repository
public interface UserMapper extends BaseMapper<User> {
}

service层

package com.xuda.msm.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xuda.msm.entity.User;
import com.xuda.msm.vo.UserVo;

import javax.servlet.http.HttpSession;

public interface UserService extends IService<User> {

    boolean sendMimeMail(String email, HttpSession session);

    boolean registered(UserVo userVo, HttpSession session);

    User loginIn(String email, String password,HttpSession session);
}

serviceImpl层

package com.xuda.msm.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xuda.msm.entity.User;
import com.xuda.msm.mapper.UserMapper;
import com.xuda.msm.service.UserService;
import com.xuda.msm.service.ex.EmailInputErroeException;
import com.xuda.msm.service.ex.SendEmailFileException;
import com.xuda.msm.service.ex.UserNotFoundException;
import com.xuda.msm.service.ex.emailEmptyException;
import com.xuda.msm.vo.UserVo;
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 javax.servlet.http.HttpSession;
import java.util.Random;

/**
 * @author :程序员徐大大
 * @description:TODO
 * @date :2022-04-24 18:29
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    //需要导入springboot的mail启动依赖
    @Autowired
    private JavaMailSender mailSender;
    @Autowired
    private UserMapper userMapper;

    //application.properties中的以及配置的值
    @Value("${spring.mail.username}")
    private String from;
    /**
     * 给前端输入的邮箱进行邮箱信息发送
     * @param email
     * @param session
     * @return
     */
    @Override
    public boolean sendMimeMail(String email, HttpSession session) {
        try {
            SimpleMailMessage mailmessage = new SimpleMailMessage();
            mailmessage.setSubject("邮箱验证码"); //主题
            //生成随机数放入code中
            String code = randomCode();
            session.setAttribute("email",email);
            session.setAttribute("code",code); //将随机数放入session中
            mailmessage.setText("您收到的验证码是:"+code); //内容
            mailmessage.setTo(email); //发给谁
            mailmessage.setFrom(from); //自己的邮箱进行发送
            mailSender.send(mailmessage); //进行发送
            return true;
        } catch (Exception e) {
            throw new SendEmailFileException("验证码发送失败");
        }
    }

    /**
     * 进行验证码的校验
     * @param userVo 前端传递的数据
     * @param session 获取数据
     * @return
     */
    @Override
    public boolean registered(UserVo userVo, HttpSession session) {
        //获取session的信息
        String email = (String) session.getAttribute("email");
        String code = (String) session.getAttribute("code");
        //获取表单的提交的校验信息
        String Vocode = userVo.getCode();
        if (email == null || email.isEmpty()) {
            throw new emailEmptyException("验证码不能为空");
        } else
            if (!code.equals(userVo.getCode())){
                throw new EmailInputErroeException("您输入的的验证码有误[" + userVo +"],请从新输入");
            }
        User user =new User();

        //传值
        user.setUsername(userVo.getUsername());
        user.setPassword(userVo.getPassword());
        user.setEmail(userVo.getEmail());
        int insert = userMapper.insert(user);
        System.out.println(insert);
        //返回包装后的对象
        return true;
    }

    /**
     * 通过输入的email查询password,然后比较登录
     * @param email
     * @param password
     * @return
     */
    @Override
    public User loginIn(String email, String password,HttpSession session) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("email",email)
                .eq("password",password);
        User user = userMapper.selectOne(queryWrapper);
        if (user == null) {
            throw new UserNotFoundException("用户数据不存在请进行注册");
        }
        session.setAttribute("user",user);
        return user;
    }

    /**
     * 生成随机数
     * @return
     */
    public String randomCode(){
        StringBuffer str = new StringBuffer();
        Random random = new Random();
        for(int i=0;i<6;i++){
            str.append(random.nextInt(10));
        }
        return str.toString();
    }


}

service异常规划

package com.xuda.msm.service.ex;

/**
 * @author :程序员徐大大
 * @description:TODO
 * @date :2022-04-24 18:41
 */
public class ServiceException extends RuntimeException{
    public ServiceException() {
        super();
    }

    public ServiceException(String message) {
        super(message);
    }

    public ServiceException(String message, Throwable cause) {
        super(message, cause);
    }

    public ServiceException(Throwable cause) {
        super(cause);
    }

    protected ServiceException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

package com.xuda.msm.service.ex;

/**
 * @author :程序员徐大大
 * @description:TODO
 * @date :2022-04-24 19:40
 */
public class UserNotFoundException extends ServiceException{
    public UserNotFoundException() {
        super();
    }

    public UserNotFoundException(String message) {
        super(message);
    }

    public UserNotFoundException(String message, Throwable cause) {
        super(message, cause);
    }

    public UserNotFoundException(Throwable cause) {
        super(cause);
    }

    protected UserNotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

package com.xuda.msm.service.ex;

/**
 * @author :程序员徐大大
 * @description:TODO
 * @date :2022-04-24 18:42
 */
public class SendEmailFileException extends ServiceException{
    public SendEmailFileException() {
        super();
    }

    public SendEmailFileException(String message) {
        super(message);
    }

    public SendEmailFileException(String message, Throwable cause) {
        super(message, cause);
    }

    public SendEmailFileException(Throwable cause) {
        super(cause);
    }

    protected SendEmailFileException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

package com.xuda.msm.service.ex;

/**
 * @author :程序员徐大大
 * @description:TODO
 * @date :2022-04-24 19:30
 */
public class EmailInputErroeException extends ServiceException{
    public EmailInputErroeException() {
        super();
    }

    public EmailInputErroeException(String message) {
        super(message);
    }

    public EmailInputErroeException(String message, Throwable cause) {
        super(message, cause);
    }

    public EmailInputErroeException(Throwable cause) {
        super(cause);
    }

    protected EmailInputErroeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

package com.xuda.msm.service.ex;

/**
 * @author :程序员徐大大
 * @description:TODO
 * @date :2022-04-24 19:24
 */
public class emailEmptyException extends ServiceException{
    public emailEmptyException() {
        super();
    }

    public emailEmptyException(String message) {
        super(message);
    }

    public emailEmptyException(String message, Throwable cause) {
        super(message, cause);
    }

    public emailEmptyException(Throwable cause) {
        super(cause);
    }

    protected emailEmptyException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

controller控制层

package com.xuda.msm.controller;

/**
 * @author :程序员徐大大
 * @description:TODO
 * @date :2022-04-24 18:40
 */

import com.xuda.msm.service.ex.*;
import com.xuda.msm.utils.JsonResult;
import org.springframework.web.bind.annotation.ExceptionHandler;

/**控制器基类*/
public class BaseController {
    /** 操作成功的状态码 */
    public static final int OK = 200;


    @ExceptionHandler(ServiceException.class)
    public JsonResult<Void> handleException(Throwable e) {
        JsonResult<Void> result = new JsonResult<Void>(e);
        if (e instanceof SendEmailFileException) {
            result.setState(4000);
        } else if (e instanceof UserNotFoundException) {
            result.setState(4001);
        } else if (e instanceof EmailInputErroeException) {
            result.setState(4002);
        } else if (e instanceof emailEmptyException) {
            result.setState(4003);
        }
        return result;
    }
}

package com.xuda.msm.controller;

import com.xuda.msm.entity.User;
import com.xuda.msm.service.UserService;
import com.xuda.msm.utils.JsonResult;
import com.xuda.msm.vo.UserVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;

/**
 * @author :程序员徐大大
 * @description:TODO
 * @date :2022-04-24 18:31
 */

@RestController
@RequestMapping("user")
public class UserController extends BaseController {
    @Autowired
    private UserService userService;

    @RequestMapping("sendEmail")
    public JsonResult<Void> sendEmail(String email, HttpSession session) {
        userService.sendMimeMail(email,session);
        return new JsonResult<Void>(OK);
    }
    @RequestMapping("regist")
    public JsonResult<Void> regist(UserVo userVo, HttpSession session) {
        System.out.println(session.getAttribute("code"));
        //这里进行简单的校验 ,建议可以进行升级放入redis
       boolean isSuccess = userService.registered(userVo,session);
        return new JsonResult<Void>(OK);
    }

    @RequestMapping("login")
    public JsonResult<User> login(String email,String password,HttpSession session) {
       //User data = userService.loginIn(email,password);
        User user = userService.loginIn(email, password,session);
        return new JsonResult<User>(OK,user);
    }
}

json工具类

package com.xuda.msm.utils;

import java.io.Serializable;

/**
 * @author :程序员徐大大
 * @description:返回前端数据
 * @date :2022-04-24 18:35
 */
public class JsonResult<E> implements Serializable {
    /**状态码*/
    private Integer state;

    /**状态描述信息*/
    private String message;

    /**数据*/
    private E data;

    public JsonResult(Integer state) {
        super();
        this.state = state;
    }
    /** 出现异常时调用 */
    public JsonResult(Throwable e) {
        super();
        // 获取异常对象中的异常信息
        this.message = e.getMessage();
    }

    public JsonResult(Integer state, E data) {
        super();
        this.state = state;
        this.data = data;
    }

    public Integer getState() {
        return state;
    }

    public void setState(Integer state) {
        this.state = state;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public E getData() {
        return data;
    }

    public void setData(E data) {
        this.data = data;
    }
}

vo类

package com.xuda.msm.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author :程序员徐大大
 * @description:TODO
 * @date :2022-04-24 18:27
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserVo {
    private String username;
    private String password;
    private String email;
    //验证码
    private String code;
}

配置类(可以不加,我这里是为了记录)

package com.xuda.msm.config;

import org.mybatis.logging.Logger;
import org.mybatis.logging.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author :程序员徐大大
 * @description:TODO
 * @date :2022-04-24 20:38
 */
@Configuration
public class LoginHandlerInterceptor implements HandlerInterceptor {
    private static final Logger log = LoggerFactory.getLogger(LoginHandlerInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // log.info("session+=》{}",request.getSession().getAttribute("user"));
        //登录成功后,应该有用户得session
        Object loginuser = request.getSession().getAttribute("user");
        if (loginuser != null) {
            request.setAttribute("loginmsg", "没有权限请先登录");
            request.getRequestDispatcher("/login.html").forward(request, response);
            return false;
        } else {
            return true;
        }
    }
}


package com.xuda.msm.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author :程序员徐大大
 * @description:TODO
 * @date :2022-04-24 20:37
 */
@Configuration
public class MvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("redirect:/login");
        registry.addViewController("login").setViewName("login");
        registry.addViewController("login.html").setViewName("login");
        registry.addViewController("regist").setViewName("regest");
        registry.addViewController("sendEmail");

        registry.addViewController("addEmp").setViewName("addEmp");
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
                .excludePathPatterns("/regist","/user/login","/css/**","/static/**","/js/**","/img/**","/user/regist","/login","regest.html","/login.html");
    }
}

发送验证码
在这里插入图片描述收到验证码
在这里插入图片描述注册成功
在这里插入图片描述
登录成功
在这里插入图片描述数据库信息添加成功
在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小徐同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值