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

2022年4月26日16:23:17
评论

设计依赖

springboot mybatis-plus json数据 MySQL8 lombok

先打开qq邮箱权限记住验证key

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

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

springboot使用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");
}
}

发送验证码

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

收到验证码

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

注册成功

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

登录成功

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

数据库信息添加成功

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

匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: