SpringBoot实现网站注册,邮件激活码激活功能

项目源码:https://gitee.com/smfx1314/springbootemail

上一篇文章已经讲到如何springboot如何实现邮件的发送,趁热打铁,这篇文章实现如下功能。
很多网站注册功能都会给您注册的邮箱发送一封邮件,里面是一串连接,点击链接激活功能,今天咱们就实现这个功能。

原理:
在您注册的时候,User类中设置一个邮件码code,同时用户状态未激活。邮件码可以通过UUID实现,这样在注册的时候发送一封邮件,把这个邮件码以html的格式发送到指定邮箱,然后通过点击链接,把邮件码在提交到后台进行对比,如果邮件中的邮件码跟发送时设置的一样,就把用户状态改为激活,然后登陆即可。

开始编码

第一步搭搭建开发环境,只需要通过springboot整合mybatis实现用户注册登录功能即可,然后在注册的时候调用邮件接口发送邮件就可以了

项目结构


引入相关依赖,这里使用的是阿里巴巴druid数据库连接池

pom.xml

<properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--MyBatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>

        <!--SpringBoot测试支持-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--MySQL-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!--SpringBoot热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
        </dependency>

        <!--Druid数据库连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!--邮件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

        <!--thymeleaf-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
    </dependencies>

上面引入了热部署依赖,不引人页是可以的。另外还有thymeleaf模板引擎,springboot默认支持此引擎

引入相关依赖之后,节下来根据项目结构创建对应的包,请参考上文中的结构图。在目录结构完善之后,下面开始配置相关属性

application.properties配置

##热部署
spring.devtools.remote.restart.enabled=true
spring.devtools.restart.additional-paths=src/main

## 数据库连接配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test2?characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.username=“你的用户名”
spring.datasource.password=“你的密码”

#默认编码配置
spring.http.encoding.charset=UTF-8
spring.http.encoding.force=true
spring.http.encoding.enabled=true
server.tomcat.uri-encoding=UTF-8

## MyBatis相关配置
mybatis.type-aliases-package=com.jiangfeixiang.springbootemail.entity
mybatis.mapper-locations=mapper/*.xml

spring.thymeleaf.prefix=classpath:/templates/

##邮箱服务器地址
##QQ smtp.qq.com
##sina smtp.sina.cn
##aliyun smtp.aliyun.com
##163 smtp.163.com
spring.mail.host=smtp.qq.com
##邮箱用户名
[email protected]
##邮箱密码(注意:qq邮箱应该使用独立密码,去qq邮箱设置里面获取)
spring.mail.password=ivhkrccrallkbdcf
##编码格式
spring.mail.default-encoding=UTF-8
##发送邮件地址
[email protected]

注意:数据库配置全部改写成您自己的账号密码,数据库等信息。邮箱配置不明白的可以参考上一篇springboot如何实现邮件的发送

以上都完成之后,接下来是完善实体类,另外数据库这里就不在提示了,只有一个user类,可以自己完善一下

实体类User

public class User implements Serializable {
    private Integer id;
    private String username;
    private String password;
    private String useremail;
    /**
     * 状态:0代表未激活,1代表激活
     */
    private Integer status;
    /**
     * 利用UUID生成一段数字,发动到用户邮箱,当用户点击链接时
     * 在做一个校验如果用户传来的code跟我们发生的code一致,更改状态为“1”来激活用户
     */
    private String  code;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public String getUseremail() {
        return useremail;
    }

    public void setUseremail(String useremail) {
        this.useremail = useremail;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", useremail='" + useremail + '\'' +
                ", status=" + status +
                ", code='" + code + '\'' +
                '}';
    }
}

说明:

  • 用户状态status:0代表未激活,1代表激活,注册的时候,默认是0,只有激活邮箱激活码可以更改为1
  • 邮箱激活码code:利用UUID生成一段数字,发动到用户邮箱,当用户点击链接时,在做一个校验,如果用户传来的code跟我们发送的code一致,更改状态为“1”来激活用户

实体类完成之后下面开始完善dao以及对应的mapper.xml文件

对应UserDao

public interface UserDao {
    /**
     * 用户注册,注册的时候默认状态为0:未激活,并且调用邮件服务发送激活码到邮箱
     * @param user
     */
    void register(User user);

    /**
     * 点击邮箱中的激活码进行激活,根据激活码查询用户,之后再进行修改用户状态为1进行激活
     * @param code
     * @return
     */
    User checkCode(String code);

    /**
     * 激活账户,修改用户状态为“1”进行激活
     * @param user
     */
    void updateUserStatus(User user);

    /**
     * 登录,根据用户状态为“1”来查询
     * @param user
     * @return
     */
    User loginUser(User user);
}

代码中有详细说明,接下来是UserDao对应的映射文件UserMapper.xml

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.jiangfeixiang.springbootemail.dao.UserDao" >

  <!--注册用户-->
  <insert id="register" parameterType="com.jiangfeixiang.springbootemail.entity.User" >
    insert into user ( username, password,useremail,status,code)
    values (#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{useremail,jdbcType=VARCHAR},
      #{status,jdbcType=INTEGER},#{code,jdbcType=INTEGER})
  </insert>

  <!--根据激活码code查询用户-->
  <select id="checkCode" parameterType="String" resultType="com.jiangfeixiang.springbootemail.entity.User">
    select * from user where code = #{code}
  </select>

  <!--激活账户,修改用户状态-->
  <update id="updateUserStatus" parameterType="com.jiangfeixiang.springbootemail.entity.User">
    update user set status=1,code=null where id=#{id}
  </update>

  <!--登录,根据 status=1 进行查询-->
  <select id="loginUser" resultType="com.jiangfeixiang.springbootemail.entity.User" >
    select * from user where username=#{username} and password=#{password} and status=1
  </select>
</mapper>

dao以及对象映射文件完成之后,开始编写Service接口与实现类

UserService接口

public interface UserService {
    /**
     * 用户注册,
     * @param user
     */
    void register(User user);

    /**
     * 根据激活码code查询用户,之后再进行修改状态
     * @param code
     * @return
     */
    User checkCode(String code);

    /**
     * 激活账户,修改用户状态为“1”
     * @param user
     */
    void updateUserStatus(User user);

    /**
     * 登录
     * @param user
     * @return
     */
    User loginUser(User user);
}

下面是与之对应的实现类

UserServiceImpl实现类

@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    /**
     * 注入邮件接口
     */
    @Autowired
    private MailService mailService;

    /**
     * 用户注册,同时发送一封激活邮件
     * @param user
     */
    @Override
    public void register(User user) {
        userDao.register(user);
        //获取激活码
        String code = user.getCode();
        System.out.println("code:"+code);
        //主题
        String subject = "来自xxx网站的激活邮件";
        //user/checkCode?code=code(激活码)是我们点击邮件链接之后根据激活码查询用户,如果存在说明一致,将用户状态修改为“1”激活
        //上面的激活码发送到用户注册邮箱
        String context = "<a href=\"/user/checkCode?code="+code+"\">激活请点击:"+code+"</a>";
        //发送激活邮件
        mailService.sendHtmlMail (user.getUseremail(),subject,context);
    }

    /**
     * 根据激活码code进行查询用户,之后再进行修改状态
     * @param code
     * @return
     */
    @Override
    public User checkCode(String code) {

        return userDao.checkCode(code);
    }

    /**
     * 激活账户,修改用户状态
     * @param user
     */
    @Override
    public void updateUserStatus(User user) {
        userDao.updateUserStatus(user);
    }

    /**
     * 登录
     * @param user
     * @return
     */
    @Override
    public User loginUser(User user) {
        User user1 = userDao.loginUser(user);
        if (user1 !=null){
            return user1;
        }
        return null;
    }
}

邮件接口

public interface MailService {

    /**
     * 发送文本邮件
     * @param to
     * @param subject
     * @param content
     */
    //void sendSimpleMail(String to, String subject, String content);

    /**
     * 发送HTML邮件,方便用户点击附带的code用来验证激活账户
     * @param to
     * @param content
     */
    void sendHtmlMail(String to, String subject, String content);

}

下面是对应的实现类

MailServiceImpl实现类

@Service
public class MailServiceImpl implements MailService {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    private JavaMailSender mailSender;
    /**
     * 配置文件中我的qq邮箱
     */
    @Value("${spring.mail.from}")
    private String from;

    /**
     * 发送HTML邮件
     * @param to 收件者
     * @param subject 邮件主题
     * @param content 文本内容
     */
    @Override
    public void sendHtmlMail(String to,String subject,String content) {
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper helper = null;
        try {
            helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(subject);
            helper.setTo(to);
            helper.setText(content, true);
            mailSender.send(message);
            //日志信息
            logger.info("邮件已经发送。");
        } catch (MessagingException e) {
            logger.error("发送邮件时发生异常!", e);
        }
    }
}

主程序入口上不要忘记添加@MapperScan

@SpringBootApplication
@MapperScan("com.jiangfeixiang.springbootemail.dao")
public class SpringbootemailApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootemailApplication.class, args);
    }

}

DruidDbConfig数据源配置

@Configuration
public class DruidDbConfig {
    private Logger logger = LoggerFactory.getLogger(DruidDbConfig.class);

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
   public DruidDataSource druidConfig(){

       return new DruidDataSource();
   }
}

UUIDUtils 随机生成激活码

public class UUIDUtils {
    public static String getUUID(){
        return UUID.randomUUID().toString().replace("-","");
    }
}

UserController控制类

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 注册
     * @param user
     * @return
     */
    @RequestMapping(value = "/registerUser")
    public String register(User user){
        user.setStatus(0);
        String code = UUIDUtils.getUUID()+ UUIDUtils.getUUID();
        user.setCode(code);
        userService.register(user);
        return "success";
    }

    /**
     *校验邮箱中的code激活账户
     * 首先根据激活码code查询用户,之后再把状态修改为"1"
     */
    @RequestMapping(value = "/checkCode")
    public String checkCode(String code){
        User user = userService.checkCode(code);
        System.out.println(user);
        //如果用户不等于null,把用户状态修改status=1
       if (user !=null){
           user.setStatus(1);
           //把code验证码清空,已经不需要了
           user.setCode("");
           System.out.println(user);
           userService.updateUserStatus(user);
       }
        return "login";
    }

    /**
     * 跳转到登录页面
     * @return login
     */
    @RequestMapping(value = "/loginPage")
    public String login(){
        return "login";
    }

    /**
     * 登录
     */
    @RequestMapping(value = "/loginUser")
    public String login(User user, Model model){
        User u = userService.loginUser(user);
        if (u !=null){
            return "welcome";
        }
        return "login";
    }
}

首页控制类

@Controller
public class IndexController {
    /**
     * 首页,localhost:8080直接返回index页面
     */
    @RequestMapping(value = "/")
    public String index(){

        return "index";
    }
}

templates下html页面

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
</head>
<body>
    <form action="/user/registerUser" method="post">
        用户名:<input type="text" id="username" name="username"/><br>
        密码:<input type="password" id="password" name="password"/><br>
        邮箱:<input type="email" id="email" name="useremail"><br>
        <input type="submit" value="注册">
    </form>
    <a href="/user/loginPage">登录</a>
</body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <form action="/user/loginUser" method="post">
        用户名:<input type="text" id="username" name="username"/><br>
        密码:<input type="password" id="password" name="password"/><br>
    <input type="submit" value="登录">
</form>
</body>
</html>

success.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册成功</title>
</head>
<body>
    前往邮箱激活账户
</body>
</html>

welcome.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>欢迎</title>
</head>
<body>
    登录成功
</body>
</html>

原文地址:https://www.cnblogs.com/smfx1314/p/10332330.html

时间: 2024-10-14 00:24:02

SpringBoot实现网站注册,邮件激活码激活功能的相关文章

PhotoZoom Pro 8 激活码激活教程

PhotoZoom是一款图片无所放大工具,一般情况下,我们对软件进行方法,像素会降低,图片很模糊,在图片的边缘会出现锯齿,但是PhotoZoom软件可以是图片无损方法,PhotoZoom Pro 8 激活码是用于激活PhotoZoom软件的一串序列号,下面就给大家介绍Photozoom软件主要功能及激活码激活教程..软件下载: PhotoZoom Pro 8.PhotoZoom Pro 8 为简体中文版,支持Win和Mac两种版本,具有S-Spline Max 技术.支持批量处理大量图片.配有各

office2019专业版激活码 激活秘钥

office2019专业版激活码 激活秘钥 2019年5月更新 [Key]:F4QWT-NMMKH-XPTV9-W9HFB-B4JCQ [剩余次数:900000+] office2019激活 产品秘钥二.Microsoft Office 2019 Vol版Gvlk密钥(KMS激活专用) 产品秘钥 Office Professional Plus 2019:NMMKJ-6RK4F-KMJVX-8D9MJ-6MWKP Office Standard 2019:6NWWJ-YQWMR-QKGCB-6T

office 2016 专业版 激活码 激活秘钥 永久密匙 产品密匙 激活工具 激活教程

一.office2016激活11月更新 [Key]:F47WT-NMMKH-S6SGS-W9HFB-B4JC7 [剩余次数:900000+] office2016激活 产品秘钥 二.Microsoft Office 2016 Vol版Gvlk密钥(KMS激活专用) 产品秘钥 Office Professional Plus 2016:JS72HS-SH27S-KMJVX-8D9MJ-6MWKP Office Standard 2016:WH28S-WKDNS-SH7SH-6TMB3-9D9HK

EJR互助激活码预定购买注册链接,EJR众创社区正式开放注册

EJR互助金融正式开启注册,注册链接 点我  ,激活码购买联系微信duoshouvip 注册相关 1.帐号注册必须使用推荐人专属注册地址,注册时需填写身份证号码,注册后将无法修改个人信息,请认真填写. 2.严格封杀多账号操作.一旦查实一人多号,立即封号,永不解封,账号内所有资金清零. 3.新会员注册后,72小时内没有提供援助将会冻结账号.账号冻结后不予解封. 4.账号开通需购买激活码激活账号(激活码100元/个),通过每天下放一定数激活码来严格控制进场人数来保证每位会员有序进场出场. 静态收益

Phpstorm 2017.3.2激活码(DataGrip WebStorm 激活码)

最早参考自:http://blog.csdn.net/Guanjs2016/article/details/71418668 (此文中有些我试了不能用) 1.license server 在线激活方式 http://idea.ibdyr.com (我的phpstorm2017.3.2,  DataGrip2017.3 都可以用)(更新于:2018.1.17) 如图: 没有联网就提示不激活了哦. 或者使用下面的,网上的. http://jetbrains.tencent.click (可以用)ht

pyCharm最新2018激活码(转)

原文地址:https://blog.csdn.net/u014044812/article/details/78727496 社区版和专业版区别: 因公司的需求,需要做一个爬取最近上映的电影.列车号.航班号.机场.车站等信息,所以需要我做一个爬虫项目,当然java也可以做爬虫,但是还是没有python这样方便,所以也开始学习Python啦!!! 欲善其事,必先利其器.这里我为大家提供了三种激活方式: 授权服务器激活:适合小白,一步到位,但服务器容易被封 激活码激活:适合小白,Windows.Ma

Pycharm2020最新激活码汇总|pycharm永久激活-速度转发收藏

最近很多人的Pycharm激活时间又过期了,后台很多人索要激活码,我就再把激活的方法汇和工具再梳理一次给大家. 最主要有两种激活方式(两种方式需要的激活码不同): 一.激活码激活:一般一年多需要激活一次,在License Activation激活界面,选择Active,选择Activation code,粘贴如下激活码,点击ok.读者福利,想要了解python可直接点击链接即可领取相关学习福利包:https://shimo.im/docs/3GtTJxvVhwxwKvxG 是安全网站放心,继续访

PyCharm最新2018激活码,最新方法

内容:通过修改hosts文件,让pycharm不能够联网验证激活码的方式 1.修改hosts文件 文件位置:C:\Windows\System32\drivers\etc 在文件末尾添加:0.0.0.0 account.jetbrains.com 如图: 2.打开PyCharm,选择 Activate code(用激活码激活) EB101IWSWD-eyJsaWNlbnNlSWQiOiJFQjEwMUlXU1dEIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaW

pyCharm最新2018激活码

最新找到的一个激活服务器,推荐大家使用激活服务器的方式激活,原因是这种方式简单快捷且没有过期时间.如果这种方式实在无法激活,可是使用下面的激活码方式激活. 服务器激活方式: 选择License server激活,然后填入:http://artemis.my.to,然后点Activate激活即可 ----------------更新分割线2018.02.05---------------- 激活码方式: 1.修改hosts文件: 添加下面一行到hosts文件,目的是屏蔽掉Pycharm对激活码的验