当前位置: 移动技术网 > IT编程>开发语言>Java > SpringBoot实现网站注册,邮件激活码激活功能

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

2019年01月29日  | 移动技术网IT编程  | 我要评论

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

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

原理:
在您注册的时候,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
##邮箱用户名
spring.mail.username=1016767658@qq.com
##邮箱密码(注意:qq邮箱应该使用独立密码,去qq邮箱设置里面获取)
spring.mail.password=ivhkrccrallkbdcf
##编码格式
spring.mail.default-encoding=utf-8
##发送邮件地址
spring.mail.from=1016767658@qq.com

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

以上都完成之后,接下来是完善实体类,另外数据库这里就不在提示了,只有一个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页面

<!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>

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网