java实现邮箱验证的功能

在日常生活中,我们在一个网站中注册一个账户时,往往在提交个人信息后,网站还要我们通过手机或邮件来验证,邮件的话大概会是下面这个样子的:

用户通过点击链接从而完成注册,然后才能登录。

也许你会想,为什么要这么麻烦直接提交注册不就行了吗?这其中很大一部分原因是为了防止恶意注册。接下来让我们一起来使用最简单的JSP+Servlet的方式来完成一个通过邮箱验证注册的小案例吧。

准备工作

前提知识

动手实践之前,你最好对以下知识有所了解:

  • JSP和Servlet
  • Maven
  • MySQL
  • c3p0
  • SMTP协议和POP3协议

如果对邮件收发过程完全不了解的话,可以花三分钟的时间到慕课网了解一下,讲得算是非常清楚了,这里就不赘述了。放张图回忆一下:

邮箱准备

在了解的上述内容之后,要实现这个案例,首先我们还得有两个邮箱账号,一个用来发送邮件,一个用来接收邮件。本案例使用QQ邮箱向163邮箱发送激活邮件,因此需要登录QQ邮箱,在设置->账户面板中开启POP3/SMTP服务,以允许我们通过第三方客户端发送邮件:

还要注意的是,登录以下服务: POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务时,需要用到授权码而不是QQ密码,授权码是用于登录第三方邮件客户端的专用密码。因此我们需要获得授权码,以在后面的程序中使用。

好了,到此准备工作就差不多了,下面开始动手吧。

实现注册Demo

创建Maven工程

本次案例基于Maven,因此你要先创建一个Maven的Web工程,并引入相关依赖:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

<dependencies>

        <!-- JavaEE依赖 -->

        <dependency>

            <groupId>javaee</groupId>

            <artifactId>javaee-api</artifactId>

            <version>5</version>

            <scope>test</scope>

        </dependency>

        <dependency>

            <groupId>taglibs</groupId>

            <artifactId>standard</artifactId>

            <version>1.1.2</version>

        </dependency>

        <!-- mysql驱动依赖 -->

        <dependency>

            <groupId>mysql</groupId>

            <artifactId>mysql-connector-java</artifactId>

            <version>5.1.40</version>

        </dependency>

        <!-- c3p0依赖 -->

        <dependency>

            <groupId>c3p0</groupId>

            <artifactId>c3p0</artifactId>

            <version>0.9.1.2</version>

        </dependency>

        <!-- JavaMail相关依赖 -->

        <dependency>

            <groupId>javax.mail</groupId>

            <artifactId>mail</artifactId>

            <version>1.4.7</version>

        </dependency>

        <dependency>

            <groupId>javax.activation</groupId>

            <artifactId>activation</artifactId>

            <version>1.1.1</version>

        </dependency>

</dependencies>

创建数据库表

接下来使用MySQL创建一张简单的用户表:

1

2

3

4

5

6

7

8

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;

其中要注意的地方是state字段(用来判断用户账号是否激活)和code字段(激活码)。

创建注册页面

使用JSP创建一个最简单的注册页面(请自行忽略界面):

嗯,果然够简单。

主要的业务逻辑

先想一下,我们的整个流程应该是这样的:

  1. 用户填写相关信息,点击注册按钮
  2. 系统先将用户记录保存到数据库中,其中用户状态为未激活
  3. 系统发送一封邮件并通知用户去验证
  4. 用户登录邮箱并点击激活链接
  5. 系统将用户状态更改为已激活并通知用户注册成功

搞清楚了整个流程,实现起来应该就不难了。下图是我建立的包结构:

ps:完整代码请见后文链接,这里只讨论主要的思路

首先是,用户提交注册信息后,相应的servlet会将相关信息传给service层去处理,在service中需要做的就是讲记录保存到数据库中(调用dao层),然后再给用户发送一封邮件,UserServiceImpl相关代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

public boolean doRegister(String userName, String password, String email) {

    // 这里可以验证各字段是否为空

    

    //利用正则表达式(可改进)验证邮箱是否符合邮箱的格式

    if(!email.matches("^\\w+@(\\w+\\.)+\\w+$")){

        return false;

    }

    //生成激活码

    String code=CodeUtil.generateUniqueCode();

    User user=new User(userName,email,password,0,code);

    //将用户保存到数据库

    UserDao userDao=new UserDaoImpl();

    //保存成功则通过线程的方式给用户发送一封邮件

    if(userDao.save(user)>0){

        new Thread(new MailUtil(email, code)).start();;

        return true;

    }

    return false;

}

  

需要注意的是,应该新建一个线程去执行发送邮件的任务,不然被骂估计是免不了了。
数据库的操作比较简单,此处就不贴出来了,无非是将用户记录插到数据库中。值得一提的是,此处使用c3p0来作为数据源来替代DriverManager,在频繁获取释放数据库连接时效率会大大提高,c3p0最简单的配置如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<?xml version="1.0" encoding="UTF-8"?>

<c3p0-config>

    <named-config name="mysql">

        <property name="driverClass">com.mysql.jdbc.Driver</property>

        <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test1?useSSL=false</property>

        <property name="user">root</property>

        <property name="password">123456</property>

        <!-- 初始化时一个连接池尝试获得的连接数量,默认是3,大小应该在maxPoolSize和minPoolSize之间 -->

        <property name="initialPoolSize">5</property>

        <!-- 一个连接最大空闲时间(单位是秒),0意味着连接不会过时 -->

        <property name="maxIdleTime">30</property>

        <!-- 任何指定时间的最大连接数量 ,默认值是15 -->

        <property name="maxPoolSize">20</property>

        <!-- 任何指定时间的最小连接数量 ,默认值是3 -->

        <property name="minPoolSize">5</property>

    </named-config>

</c3p0-config>

提供一个工具类DBUtil以获取,释放连接:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

public class DBUtil {

private static ComboPooledDataSource cpds=null;

static{

    cpds=new ComboPooledDataSource("mysql");

}

public static Connection getConnection(){

    Connection connection=null;

    try {

        connection = cpds.getConnection();

    catch (SQLException e) {

        e.printStackTrace();

    }

    return connection;

}

public static void close(Connection conn,PreparedStatement pstmt,ResultSet rs){

    try {

        if(rs!=null){

            rs.close();

        }

        if(pstmt!=null){

            pstmt.close();

        }

        if(rs!=null){

            rs.close();

        }

    catch (SQLException e) {

        e.printStackTrace();

    }

    

}

}

  

要特别注意的一点是:即使是使用连接池,使用完Connection后调用close方法,当然这不意味着关闭与数据库的TCP 连接,而是将连接还回到池中去,如果不close掉的话,这个连接将会一直被占用,直到连接池中的连接耗尽为止。

使用JavaMail发送邮件

使用JavaMail发送邮件非常简单,也是三步曲:

  1. 创建连接对象javax.mail.Session
  2. 创建邮件对象 javax.mail.Message
  3. 发送邮件

直接看代码,详细的注释在代码中,MailUtil代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

public class MailUtil implements Runnable {

    private String email;// 收件人邮箱

    private String code;// 激活码

    public MailUtil(String email, String code) {

        this.email = email;

        this.code = code;

    }

    public void run() {

        // 1.创建连接对象javax.mail.Session

        // 2.创建邮件对象 javax.mail.Message

        // 3.发送一封激活邮件

        String from = "xxx@qq.com";// 发件人电子邮箱

        String host = "smtp.qq.com"// 指定发送邮件的主机smtp.qq.com(QQ)|smtp.163.com(网易)

        Properties properties = System.getProperties();// 获取系统属性

        properties.setProperty("mail.smtp.host", host);// 设置邮件服务器

        properties.setProperty("mail.smtp.auth""true");// 打开认证

        try {

            //QQ邮箱需要下面这段代码,163邮箱不需要

            MailSSLSocketFactory sf = new MailSSLSocketFactory();

            sf.setTrustAllHosts(true);

            properties.put("mail.smtp.ssl.enable""true");

            properties.put("mail.smtp.ssl.socketFactory", sf);

            // 1.获取默认session对象

            Session session = Session.getDefaultInstance(properties, new Authenticator() {

                public PasswordAuthentication getPasswordAuthentication() {

                    return new PasswordAuthentication("xxx@qq.com""xxx"); // 发件人邮箱账号、授权码

                }

            });

            // 2.创建邮件对象

            Message message = new MimeMessage(session);

            // 2.1设置发件人

            message.setFrom(new InternetAddress(from));

            // 2.2设置接收人

            message.addRecipient(Message.RecipientType.TO, new InternetAddress(email));

            // 2.3设置邮件主题

            message.setSubject("账号激活");

            // 2.4设置邮件内容

            String content = "<html><head></head><body><h1>这是一封激活邮件,激活请点击以下链接</h1><h3><a href='http://localhost:8080/RegisterDemo/ActiveServlet?code="

                    + code + "'>http://localhost:8080/RegisterDemo/ActiveServlet?code=" + code

                    "</href></h3></body></html>";

            message.setContent(content, "text/html;charset=UTF-8");

            // 3.发送邮件

            Transport.send(message);

            System.out.println("邮件成功发送!");

        catch (Exception e) {

            e.printStackTrace();

        }

    }

}

 

ps:需要把上面的账号、授权码进行相应修改。

完成后,再有用户提交注册信息时,应该就能收到验证邮件了:

用户点击链接后,我们要做的工作就是根据code(可以利用UUID生成)更改数据库中相应用户的状态,然后提示用户注册结果了。

总结

简单介绍了如何使用JavaMail完成了一个带邮箱验证的注册案例,当然在实际开发中还有许多细节要注意,例如对用户提交信息的校验,密码进行加密等,此处的简单案例并未详尽处理这些细节。

代码 emailValidate

原文:https://www.jianshu.com/p/8f8d7a46888f

注:想要让别人能够成功的完成注册,需要提供一个公网ip,替换掉localhost

java实现邮箱注册验证相关推荐

  1. JAVA 电子邮箱格式验证,使用正则表达式

    正则表达式 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子串等. ...

  2. Java实现邮箱注册,并对邮箱进行校验。

    最近在研究邮箱/手机号注册账号. 这一篇就是基于Java语言的SpringBoot框架的邮箱校验.当然最核心的内容与SpringBoot并没有什么太大的关联. 最基本的Mapper就不展示了,专注于核 ...

  3. Java实现邮箱登录验证和邮件发送

    验证邮箱是否可用: /*** * @param host SMTP服务端地址,如qq邮箱为smtp.qq.com* @param email 邮箱名* @param password 邮箱注册码(非登 ...

  4. java ajax 登陆验证_AJAX+JAVA用户登陆注册验证

    需求 通过ajax异步刷新页面验证用户输入的账号密码是否在数据库中存在. 技术栈 JSP+Servlet+Oracle 具体代码 JSP部分: pageEncoding="UTF-8&quo ...

  5. Java基础题——注册验证(字符串的简单运用)

    题目: 写一个注册页面,要验证用户名和密码.用户名长度不能小于3,密码长度不能小于6.注册时要输入两次密码,并检验两次密码是否一致.当用户成功注册后,再关闭进程. 根据要求,我们可以先把交互界面搭起来 ...

  6. 电子邮箱注册激活(java)

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

  7. 爱旅行项目中实现邮箱注册

    实现邮箱注册需要发送电子邮件,使用spring发送电子邮件会使用到两个类,JavaMailSenderImpl这个类用来发送电子邮件,org.springframework.mail.SimpleMa ...

  8. Java 使用邮箱进行注册验证

    1.Springboot 使用邮箱进行注册验证需要导入依赖,如果是Java项目则需要导入email.jar <!--email--> <dependency><group ...

  9. 使用 Java Mail 实现注册时邮箱激活验证功能

    最近在做毕设中实现注册功能时使用到了邮箱激活验证,在此总结下. 简介 JavaMail 是提供给开发者处理电子邮件相关的编程接口,它是 SUN 发布的用来处理 email 的 API ,它可以方便地执 ...

最新文章

  1. MySQL 开发日志 -- 性能调优
  2. poj 1256 Anagram—next_permutation的神奇应用
  3. sata修改为ahci后系统无法启动_固态重装系统
  4. Python 中,matplotlib绘图无法显示中文的问题
  5. java终结者,动态语言是否会成为JAVA的终结者?
  6. Thinkphp宅音乐html5在线音乐播放器
  7. Spring框架----Spring框架的基本概念
  8. python下载大文件mp4_Python 下载 m3u8 格式视频
  9. mac php apache mysql 集成环境 的软件
  10. maven2 clean 错误的解决
  11. vue cli3.0 解决跨域问题和axios等问题,配合Django
  12. 新手学Java编程语言怎么入门?知识点都帮你整理好了
  13. mono android 开机启动,浅析 Android 平台 mono执行机制 by郡墙
  14. 【2022】软著申请流程及注意事项分享一下
  15. 推荐15个清爽简约风格的 HTML5 网站作品
  16. 为什么每次开机都要进行磁盘检查?
  17. 前端面试官常问javaScript编程题,隔壁王大爷看了都会了
  18. 使用Python读取markdown文件并统计字数
  19. 8核插上4G翅膀 MT6595借Cortex-A17领跑
  20. 实例 | 分析38万条数据,用Python分析保险产品交叉销售和哪些因素有关

热门文章

  1. 操作系统最坏适应最优适应最先适应
  2. flutter引入高德地图_玩玩Flutter Web —— 实现高德地图插件
  3. Python 爬取王者农药全套皮肤
  4. Roguelike诞生记
  5. 转行程序员日记---2020-10-16【最近有点累】
  6. 实验二——网络嗅探与欺骗.
  7. 简练软考知识点整理-项目配置审核
  8. 免费企业邮箱注册与收费的企业邮箱区别在哪
  9. == 与 === 的区别
  10. Android 如何实现气泡选择动画,食堂大妈看完都会了