专栏首页浩CodingJava实现邮箱验证功能

Java实现邮箱验证功能

如题,我们做网站的时候,往往需要用户注册,很多用户选择用邮箱注册,为了获取用户的真实邮箱和防止恶意注册,可能需要做一个邮箱验证,此篇教程就是讲解如何用Java实现邮箱验证功能。

主要业务逻辑实现过程:

  1. 用户填写完成相关信息后,点击注册,系统先将用户记录保存到数据库表中,其中用户状态为未激活。
  2. 系统发送一封邮件并通知用户去验证,邮件中包含了唯一标识用户的激活码
  3. 用户登录邮箱并点击激活链接,系统接收到激活码
  4. 系统根据激活码在数据库中找到相应用户,并将用户状态更改为已激活,最后通知用户激活成功。

项目结构(JavaWeb项目):

UserDao:数据库操作,包括用户注册、激活状态更改。

JDBCUtils:链接数据库工具类。

User:表的POJO。

ActivationServlet:用于接收激活信息。

RegisterServlet:插入用户信息到数据库中,并发送激活邮件。

项目运行效果截图:

1 . 用户登陆页面:

2 . 用户点击注册按钮后,系统将用户信息保存到数据库中:

此时用户状态是未激活:

3 . 系统向用户发送激活邮件:

4 . 用户点击激活链接,系统将用户状态改为已激活:

代码没有什么难度,看懂了实现原理就只差复制粘贴了,哈哈哈哈,这里只贴出主要部分代码,全部代码见文末链接。

UserDao:数据库操作,包括用户注册、激活状态更改。

package com.hao.validate.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import com.hao.validate.db.JDBCUtils;
import com.hao.validate.pojo.User;

public class UserDao {
  /**
   * 注册
   * @param user
   * @return
   */
  public int insert(User user) {
    Connection conn = null;
    PreparedStatement ps = null;
    int result = 0;
    try {
      conn = JDBCUtils.getConnection();
      String sql = "insert into user(username,password,email,state,code) values(?,?,?,?,?)";
      ps = conn.prepareStatement(sql);
      ps.setString(1, user.getUsername());
      ps.setString(2, user.getPassword());
      ps.setString(3, user.getEmail());
      ps.setInt(4, user.getState());
      ps.setString(5, user.getCode());
      result = ps.executeUpdate();
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return result;
  }
  
  /**
   * 注册表改为激活状态
   * @param code
   * @return
   */
  public int activation(String code) {
    Connection conn = null;
    PreparedStatement ps = null;
    int result = 0;
    try {
      conn = JDBCUtils.getConnection();
      String sql = "update user set state=1 where code=?";
      ps = conn.prepareStatement(sql);
      ps.setString(1, code);
      result = ps.executeUpdate();
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return result;
  }
}

User表的sql:

create table `user`(
    id int(11) primary key auto_increment comment '用户id',
    username varchar(255) not null comment '用户名',
    email varchar(255) not null comment '用户邮箱',
    password varchar(255) not null comment '用户密码',
    state int(1) not null default 0 comment '用户激活状态:0表示未激活,1表示激活',
    code varchar(255) not null comment '激活码'
)engine=InnoDB default charset=utf8;

ActivationServlet:用于接收激活信息。

package com.hao.validate.servlet;

import java.io.IOException;
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 com.hao.validate.dao.UserDao;

/**
 * Servlet 用于接收激活信息
 */
@WebServlet("/ActivationServlet")
public class ActivationServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;

  public ActivationServlet() {
    super();
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    // 设置请求和响应编码
    request.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    String code = request.getParameter("code");
    UserDao userDao = new UserDao();
    if (userDao.activation(code) > 0) {
      response.getWriter().append("恭喜您,激活成功!");
    } else {
      response.getWriter().append("激活失败,请检查邮箱!");
    }
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }

}

RegisterServlet:插入用户信息到数据库中,并发送激活邮件。

package com.hao.validate.servlet;

import java.io.IOException;
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 com.hao.jmail.SendEmail;
import com.hao.random.StringRandom;
import com.hao.validate.dao.UserDao;
import com.hao.validate.pojo.User;

/**
 * Servlet 注册 插入用户信息到数据库中,并发送激活邮件
 */
@WebServlet("/RegisterServlet")
public class RegisterServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;

  public RegisterServlet() {
    super();
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    // 设置请求和响应编码
    request.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    User user = new User();
    user.setUsername(request.getParameter("name"));
    user.setPassword(request.getParameter("pass"));
    user.setEmail(request.getParameter("email"));
    user.setCode(StringRandom.getStringRandom(8));// 随机激活码
    user.setState(0);// 初始状态是0 ,0表示未激活
    System.out.println(user);

    // User信息插入到数据库中
    UserDao userDao = new UserDao();
    if (userDao.insert(user) > 0) {
      response.getWriter().append("注册成功,请登录邮箱激活账号!");
      // 发送邮件
      String mailText = "<html><head></head><body><h1>这是一封激活邮件,激活请点击以下链接</h1><h3><a href='http://localhost:8080/tool/ActivationServlet?code="
          + user.getCode() + "'>http://localhost:8080/tool/ActivationServlet?code=" + user.getCode()
          + "</href></h3></body></html>";
      SendEmail.Send("发送邮件的邮箱账户", "发送邮件的邮箱密码", user.getEmail(), "备注", "发件人昵称", "主题", mailText);
    } else {
      response.getWriter().append("注册失败,请检查相关信息!");
    }
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }

}

本篇教程源码地址:

https://github.com/jiahaoit/tool.git

本文分享自微信公众号 - 浩Coding(gh_c4a2e63d2ca7),作者:浩

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SQL Server 的时间函数

    2、dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值,例如:向日期加上2天

    浩Coding
  • 小白Linux入门--入门篇:Linux下搭建JavaWeb环境

    1. 下载jdk:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-...

    浩Coding
  • Linux命令之tar——压缩

    通过SSH访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar命令就是是必不可少的一个功能强大的工具。linux中最流行的tar是麻雀虽小,五脏俱全...

    浩Coding
  • 最全的电气工程图形符号

    作为一名优秀的电气工程师,不仅要技术好,还要会看图说话,看得懂图形符号。最全的电气工程师图形符号,拿走不谢! ? ? ? ? ? ? ? ? ? ? ? ? ...

    机器人网
  • MYSQL设置远程账户登陆总结

    打开 /etc/mysql/my.cnf 文件,找到 bind-address = 127.0.0.1 修改为 bind-address = 0.0.0.0

    流柯
  • MySQL基础补充

      结构语言分类  DDL(数据定义语言)  create  drop  alter   创建删除以及修改数据库,表,存储过程,触发器,索引....  D...

    房上的猫
  • 连接虚拟机mysql无法访问,报错编号1130的解决方法

    新装一台虚拟机mysql的时候,往往会出现win无法连接的情况,报错信息1130,是因为没有权限的问题,解决方案如下: mysql -u root -p mys...

    生活创客
  • Mysql8.0 远程连接用户配置

    华创信息技术
  • 如何取消mysql授权并删除用户

    程序员同行者
  • 使用Java操作Elasticsearch(Elasticsearch的java api使用)

    1、Elasticsearch是基于Lucene开发的一个分布式全文检索框架,向Elasticsearch中存储和从Elasticsearch中查询,格式是js...

    别先生

扫码关注云+社区

领取腾讯云代金券