大家在注册论坛或者注册一些软件的账号的时候有时需要填写邮箱来注册,而为了测试你的邮箱是否是你自己的会给你的邮箱发送一个激活码链接,只有你点击这个链接之后邮箱才能注册成功,接下来我们就来实现一下这个流程。


文章目录

  • 一、环境搭建
  • 二、流程简述
  • 三、业务实现
  • 1.前端页面
  • 2.后端逻辑实现


一、环境搭建

编译器:IDEA

语言:JAVA

使用技术:servlet3.0,JDBC,jsp

服务器:tomact

数据库:MYSQL

邮箱:一个qq邮箱,一个其他的邮箱

也可以使用易邮件服务器,foxmail等等来创建模拟邮箱

完整项目下载 1.使用idea创建一个javaweb项目然后建立包结构并导入jar包

JAVA QQ邮箱 java邮箱注册_JAVA QQ邮箱


2.在数据库中创建一个user表

CREATE TABLE `user` (
   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
   `username` varchar(45) NOT NULL DEFAULT '*******' COMMENT '用户名',
   `password` varchar(45) NOT NULL DEFAULT '*******' COMMENT '密码',
   `nickname` varchar(45) NOT NULL DEFAULT '*******' COMMENT '昵称',
   `email` varchar(30) NOT NULL DEFAULT '0' COMMENT '电子邮箱',
   `state` int(11) NOT NULL COMMENT '是否激活',
   `code` varchar(64) DEFAULT NULL COMMENT '激活码',
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='用户'

3.开启qq邮箱的POP3/SMTP服务

邮箱–>设置–>账户,开启之后会获得一串授权码记下来,开启第三方邮件发送需要这个授权码

JAVA QQ邮箱 java邮箱注册_java_02

二、流程简述

启动Tomact服务器 打开浏览器 进入注册界面(http://localhost:8080/jsp/regist.jsp)输入信息和你要注册的邮箱,点击注册

JAVA QQ邮箱 java邮箱注册_JAVA QQ邮箱_03


用post请求将数据传递到registServlet中,接受数据,并且生成一个激活码,封装数据到user中,调用业务层处理(regist方法)数据实现注册UserService.java(接口)–>UserServiceImp.java(实现接口)–>UserDao.java中实现注册功能将数据存入数据库,查看数据库数据已存入,这时state字段还是0,用户还未激活(0是未激活,1已激活)

JAVA QQ邮箱 java邮箱注册_java_04


接下来UserServiceImi.java中的方法继续执行发送一封激活邮件(具体实现在下面的业务实现中)

JAVA QQ邮箱 java邮箱注册_sql_05


邮件发送完毕逻辑回到RegistServlet.java,然后跳转进入msg.jsp界面

JAVA QQ邮箱 java邮箱注册_java_06


这时打开邮箱你会发现你已经收到了一条邮件,打开然后点击链接,你会跳转到ActiveServlet.java中,根据激活码查询用户,查到用户将用户状态(state)更改为1,并将激活码设置为空(激活码只能应用一次)(这两个逻辑和上面的注册一样,只不过一个是查询一个是修改在这里就不一一描述了,自行看代码),查看数据库,数据已经更改

JAVA QQ邮箱 java邮箱注册_User_07


浏览器跳转msg.jsp中

JAVA QQ邮箱 java邮箱注册_java_08


这时一个完整的邮箱注册验证业务就搞定了!

三、业务实现

1.前端页面

注册页面 regist.jsp

<html>
<head>
  <title>注册页面</title>
</head>
<body>
<form action="/registServlet" method="post">
  <table>
    <tr>
      <td>用户名:</td>
      <td><input type="text" name="username"></td>
    </tr>
    <tr>
      <td>密码:</td>
      <td><input type="password" name="password"></td>
    </tr>
    <tr>
      <td>昵称:</td>
      <td><input type="text"name="nickname"></td>
    </tr>
    <tr>
      <td>邮箱:</td>
      <td><input type="text" name="email"></td>
    </tr>
    <tr>
      <td colspan="2"><input type="submit" value="注册"></td>
    </tr>
  </table>
</form>
</body>
</html>

消息提示页面 msg.jsp

<html>
<head>
  <title>提示信息</title>
</head>
<body>
<h1>${msg}</h1>
</body>
</html>
2.后端逻辑实现

2.1 首先在bean包中创建一个User类,包含数据库中的字段

package com.ccg.bean;

public class User {
    private Integer uId;
    private String username;
    private String password;
    private String nickname;
    private String email;
    private Integer state;
    private String code;

    public User() {
    }

    public User(String username, String password, String nickname, String email, Integer state, String code) {
        this.username = username;
        this.password = password;
        this.nickname = nickname;
        this.email = email;
        this.state = state;
        this.code = code;
    }

    public User(Integer uId, String username, String password, String nickname, String email, Integer state, String code) {
        this.uId = uId;
        this.username = username;
        this.password = password;
        this.nickname = nickname;
        this.email = email;
        this.state = state;
        this.code = code;
    }

    public Integer getuId() {
        return uId;
    }

    public void setuId(Integer uId) {
        this.uId = uId;
    }

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

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

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getState() {
        return state;
    }

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

    public String getCode() {
        return code;
    }

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

}

2.2 UserDao.java

package com.ccg.dao;

import com.ccg.bean.User;
import com.ccg.utils.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDao {
    static Connection connection = null;
    static PreparedStatement preparedStatement = null;
    static ResultSet resultSet = null;
    //dao中保存用户的方法
    public boolean regist(User user) throws SQLException, ClassNotFoundException {

        try {
            connection = DBUtil.getConnection();
            String sql = "insert into user(username,password,nickname,email,state,code) values(?,?,?,?,?,?)";
            System.out.println(sql);
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, user.getUsername());
            preparedStatement.setString(2, user.getPassword());
            preparedStatement.setString(3, user.getNickname());
            preparedStatement.setString(4, user.getEmail());
            preparedStatement.setInt(5, user.getState());
            preparedStatement.setString(6, user.getCode());
            int i = preparedStatement.executeUpdate();
            return i > 0;
        }
        finally {
            DBUtil.closeAll(preparedStatement,connection);
        }
    }

    public User findByCode(String code) throws SQLException, ClassNotFoundException {
        try{
            connection = DBUtil.getConnection();
            String sql = "select id,username,password,nickname,email,state,code from user where code = ?";
            System.out.println(sql);
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, code);
            resultSet = preparedStatement.executeQuery();
            if (resultSet.next()) {
                return new User(resultSet.getInt("id"), resultSet.getString("username"),
                        resultSet.getString("password"), resultSet.getString("nickname"),
                        resultSet.getString("email"), resultSet.getInt("state"), resultSet.getString("code"));
            } else return null;

        }
        finally {
            DBUtil.closeAll(resultSet, preparedStatement, connection);
        }
    }

    public boolean updateUser(User user) throws SQLException, ClassNotFoundException {
        try{
            connection = DBUtil.getConnection();
            String sql = "update user set state = ? ,code = ? where id = ?";
            System.out.println(sql);
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, user.getState());
            preparedStatement.setString(2, user.getCode());
            preparedStatement.setInt(3,user.getuId());
            int i = preparedStatement.executeUpdate();

            return i > 0;
        }
        finally {
            DBUtil.closeAll(resultSet, preparedStatement, connection);
        }
    }
}

2.3 UserService.java

package com.ccg.service;

import com.ccg.bean.User;
import java.sql.SQLException;

public interface UserService {
    void regist(User user) throws Exception;

    User findByCode(String code) throws SQLException, ClassNotFoundException;

    void updateByUser(User user) throws SQLException, ClassNotFoundException;
}

2.4 UserServiceImp.java

package com.ccg.service.impl;

import com.ccg.bean.User;
import com.ccg.dao.UserDao;
import com.ccg.service.UserService;
import com.ccg.utils.MailUtil;
import java.sql.SQLException;

public class UserServiceImp implements UserService {
    @Override
    //业务层用户注册的方法
    public void regist(User user) throws Exception {
        // 将数据存到数据库中
        UserDao userDao = new UserDao();
        userDao.regist(user);
        //发送一封激活邮件
        MailUtil.sendMail(user.getEmail(),user.getCode());
    }

    @Override
    //根据校验码查找用户
    public User findByCode(String code) throws SQLException, ClassNotFoundException {
        UserDao userDao = new UserDao();
        return userDao.findByCode(code);
    }

    @Override
    //更新用户激活状态
    public void updateByUser(User user) throws SQLException, ClassNotFoundException {
        UserDao userDao = new UserDao();
        userDao.updateUser(user);
    }
}

2.5 RegistServlet.java

package com.ccg.servlet;

import com.ccg.bean.User;
import com.ccg.service.UserService;
import com.ccg.service.impl.UserServiceImp;
import com.ccg.utils.UUIDUtil;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;

@WebServlet("/registServlet")
public class RegistServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接受数据
        req.setCharacterEncoding("UTF-8");
        String userName = req.getParameter("username");
        String password = req.getParameter("password");
        String nickName = req.getParameter("nickname");
        String email = req.getParameter("email");
        //封装数据
        User user = new User(userName, password, nickName, email, 0, UUIDUtil.getUUID() + UUIDUtil.getUUID());
        //调用业务层处理数据
        UserService userService = new UserServiceImp();
        try {
            userService.regist(user);
            //页面跳转
            req.setAttribute("msg", "您已注册成功请去邮箱激活!");
            req.getRequestDispatcher("/jsp/msg.jsp").forward(req, resp);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2.6 ActiveServlet.java

package com.ccg.servlet;

import com.ccg.bean.User;
import com.ccg.service.UserService;
import com.ccg.service.impl.UserServiceImp;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
@WebServlet("/ActiveServlet")
public class ActiceServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收激活码
        String code = req.getParameter("code");
        //根据激活码查询用户
        UserService userService = new UserServiceImp();
        try {
            User user = userService.findByCode(code);
            //已经查询到,修改用户的状态
            if (user != null) {
                //已经查到,修改用户的状态
                user.setState(1);
                user.setCode(null);
                userService.updateByUser(user);
                req.setAttribute("msg","您已激活成功!请去登陆!");
            } else {
                req.setAttribute("msg", "您的激活码有误!请重新激活");
            }
            //页面跳转
            req.getRequestDispatcher("/jsp/msg.jsp").forward(req,resp);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

2.7 DBUtil
实现数据库的连接

package com.ccg.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 工具类
 */

public class DBUtil {
    private static String DRIVER = "com.mysql.jdbc.Driver";
    private static String DB_URL = "jdbc:mysql://localhost:3306/coco?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true";
    private static final String USER = "root";
    private static final String PASSWORD = "123456";
    public static Connection getConnection() throws ClassNotFoundException, SQLException {
        Class.forName(DRIVER);
        return DriverManager.getConnection(DB_URL, USER, PASSWORD);
    }
    public static void closeAll(AutoCloseable... autoCloseables) {
        for (AutoCloseable autoCloseable : autoCloseables) {
            try {
                if (autoCloseable != null) {
                    autoCloseable.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

2.8 UUIDUtil.java
生成32位激活码

package com.ccg.utils;

import java.util.UUID;
public class UUIDUtil {
    public static String getUUID() {
        return UUID.randomUUID().toString().replace("-", "");
    }
}

2.9 MailUtil.java
发送一封电子邮件

package com.ccg.utils;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

public class MailUtil {
    /**
     *
     * @param to 给谁发邮件
     * @param code 邮件的校验码
     */
    public static void sendMail(String to, String code) throws Exception {
        //1.创建连接对象 连接到邮件服务器
        Properties properties = new Properties();
        //设置发送邮件的基本参数
        //1.1发送邮件服务器(注意,此处根据你的服务器来决定,如果使用的是QQ服务器,请填写smtp.qq.com)
        properties.put("mail.smtp.host", "smtp.qq.com");
        //1.2发送端口(根据实际情况填写,一般均为25)
        properties.put("mail.smtp.port", "25");
        properties.put("mail.smtp.auth", "true");
        //1.3设置发送邮件的账号和密码
        Session session = Session.getInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //两个参数分别是发送邮件的账户和授权码(注意,如果配置后不生效,请检测是否开启了 POP3/SMTP 服务,QQ邮箱对应设置位置在: [设置-账户-POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务])
                return new PasswordAuthentication("2492@qq.com","hhjjjjjbjb");
            }
        });
        //2.创建邮件对象
        Message message = new MimeMessage(session);
        //2.1设置发件人
        message.setFrom(new InternetAddress("2492@qq.com"));
        //2.2设置收件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress(to));
        //2.3设置主题
        message.setSubject("来自xxx网站的激活邮件");
        //2.4设置邮件正文  第二个参数是邮件发送的类型
        message.setContent("<h1>来自xxx网站的激活邮件,激活请点击一下链接:</h1><h3><a href='http://localhost:8080/" +
                "ActiveServlet?code="+code+"'>http://localhost:8080/ActiveServlet?code="+code+"</h3>",
                "text/html;charset=UTF-8");
        //3.发送一封邮件
        Transport.send(message);
    }
}