【途牛旅游项目04】 - 通过邮箱实现用户账号激活 - 注册发送邮箱。

注册码 - UUID的介绍

  UUID(Universally Unique Identifier)是通用唯一识别码。UUID是全球唯一的不会重复的固定长度的随机字符串。(java自带UUID在java.util.UUID中)
  标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8个 - 4个 - 4个 - 4个 - 12个),可以从cflib 下载CreateGUID() UDF进行转换。(其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字)
  UUID是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定

注册的用户给其一个UUID码,可以通过算法加密。

1. UUID的使用 - 这里用于生成激活码

1.1 UUID工具类创建(java.util.UUID)

import java.util.UUID;
/**
 * UUID工具类,能够产生UUID随机字符串工具类,全世界唯一的,不重复的字符串
 */
public final class UuidUtil {
    
    
	private UuidUtil(){
    
    }
	//获取一个UUID随机字符串
	public static String getUuid(){
    
    
		return UUID.randomUUID().toString().replace("-","");
	}
}

1.2 测试UUID能否使用

//测试UUID工具类
public class UuidUtilTest {
    
    

    //测试生成十个随机的UUID字符串
    @Test
    public void getUuid() {
    
    
        for (int i = 0; i < 10; i++) {
    
    
            String code  = UuidUtil.getUuid();
            System.out.println(code);
        }
    }
}

运行结果(生成了十个随机且不重复的字符串

d401d62bddb64653b6f33d9706f5cac1
75e95b17668f4b8a99ac34439db32548
89b951b76caf41ceb0fa2b8c0a8f22be
4e9aac6a375b4011bc387917f46847f3
25886a64779249e3a95f13c4d4d6ef7c
bb32a0cd7beb42d1a2d0f13d753534d5
c9b6bb0e82424cda86ad232ed411045c
ff31c97a69c2439d8601b120f9ce9867
da0b3cd4106c4fac99dd2f3a9d34aaf1
0c16da9b54494cc7954bcfef25542bfb

2. 激活用户实现

  user的status和code系统生成赋值,注册成功之后会给用户一个UUID的激活码发送到邮箱,用户进入邮箱点击激活,就完成激活。否则就未激活无法登录。
  激活就是产生一个超链接,发送给注册邮箱。然后用户进入邮箱,点击注册,调用注册servlet,然后将status激活状态设置为Y,并且存储激活码code。
  激活码还有一个好处,就是如果你非法使用或违反使用规则,可以通过设置激活状态为N未激活,来实现类似封号的行为。

在这里插入图片描述
3.1 修改UserService的注册方法,注册时生成激活码存入用户表

public int register(User user) {
    
    

        //查找username是否存在,存在就返回错误,不能注册
        User u = userDao.findByUserName(user.getUsername());
        if(u == null){
    
    
            user.setStatus("N");//注册成功,但是设置为未激活
            //通过UUID获取一个激活码
            user.setCode(UuidUtil.getUuid());//生成激活码
            
            //保存用户注册数据
            userDao.saveUser(user);
            return 1;//未存在,可以注册
        }else {
    
    
            return 0;//已存在,不可注册
        }
    }

3.2 在测试类TestUserService里面编写测试测试方法,测试是否能够激活。
在这里插入图片描述

//用户激活
    @Test
    public void test03() {
    
    
        UserService userService = new UserService();
        //根据 code激活码 -> 将status激活专题 改为Y激活,这里的激活码
//用户激活
    @Test
    public void test03() {
    
    
        UserService userService = new UserService();
        //根据 code激活码 -> 将status激活专题 改为Y激活,这里的激活码,是通过UUID生成的,并且注册的时候存储到用户表里面的
        //测试code激活码为0c16da9b54494cc7954bcfef25542bfb的用户激活
        int code = userService.active("0c16da9b54494cc7954bcfef25542bfb");
        if(code == 1){
    
    
            System.out.println("激活成功");
        }else if(code == 0){
    
    
            System.out.println("激活失败");
        }
    }

3.3 在UserServce里面编写激活方法active

//激活 账号激活
    public int active(String activCode) {
    
    
        //判断激活码是否正确 
        
        //激活,更新激活码
        int code =  userDao.updateStatus(activeCode); //1 表示成功
        return code;
    }

3.4 编写dao层激活方法和对应的映射文件UserDao.xml

public interface UserDao {
    
    
    //用户激活
    int updateStatus(String code);
}
<!-- 激活用户,更改激活状态status -->
    <update id="updateStatus" parameterType="String">
        update tab_user set status = 'Y' where code = #{code};
    </update>

3.5 运行测试方法,测试激活逻辑是否可用

控制台输出:激活成功
在这里插入图片描述
查看数据库,当前激活码0c16da9b54494cc7954bcfef25542bfb的用户激活状态status。
在这里插入图片描述

3.6 激活逻辑没有问题,就来编写激活的ActiveServlet
  用户激活,就是从邮箱接收一个超链接主机ip/项目名/activeServlet?activeCode=激活码比如主机/TravelNetwork/activeServlet?activeCode=0c16da9b54494cc7954bcfef25542bfb,通过点击访问该链接,调用servlet实现激活。

//激活user
@WebServlet("/activeServlet")
public class ActiveServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
            doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        UserService userService = new UserService();
        //获取参数  activeCode
        //这个激活码,是发送给用户邮箱后面带的参数,比如 /TravelNetwork/activeServlet?activeCode=0c16da9b54494cc7954bcfef25542bfb
        String activeCode = request.getParameter("activeCode");
        //处理参数,激活用户
        int code = userService.active(activeCode);
        System.out.println("activeCode = " + activeCode);
        //将激活情况响应给浏览器
        int activeMsg = 0;
        if(code==1){
    
    
            activeMsg = 1;
            //跳转登录界面
            //response.sendRedirect(request.getContextPath() + "/login.jsp");
        }else{
    
    
            activeMsg = 0;
        }
        request.setAttribute("activeMsg",activeMsg);
        //激活成功跳转响应界面
        request.getRequestDispatcher("ActiveMessage.jsp").forward(request,response);
    }
}

3.7 编写激活提示信息页面ActiveMessage.jsp
  用到jstl标签库,不会jstl的使可以意看这个 JSTL标签库的使用

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>激活情况</title>
</head>
<body>
<c:if test="${activeMsg != null && activeMsg == 1}">
    <div style="color: green">激活成功,欢迎您的使用。</div><a href=${pageContext.request.contextPath}/login.jsp title="点击,进入登录页面">前往登录</a>
</c:if>
<c:if test="${activeMsg == null || activeMsg == 0}">
    <div style="color: red">激活失败,请尝试重新激活。</div>
</c:if>

</body>
</html>

3.8 通过url地址进行测试激活

  1. 比如激活码为d9a421a341fe4ae7b2ca4ccb1062b7b8的用户当前是未激活状态。
    在这里插入图片描述
  2. 通过地址访问激活:http://localhost:8080/TravelNetwork/activeServlet?activeCode=d9a421a341fe4ae7b2ca4ccb1062b7b8,这里用到的是本地主机localhost,实际使用配置域名/IP。
    在这里插入图片描述
  3. 查看数据库当前用户是否激活
    在这里插入图片描述

3. 邮件MailUtil的使用,通过邮件点击链接激活。

注册成功之后,服务器会给用户发送一个激活邮件,里面是激活的链接,点击就能实现激活成功。
因为现在没有服务器,我们就用QQ来当我们的服务器,因为QQ有一个邮件代发功能。通过QQ邮箱代理发送邮件。

3.1 QQ代发邮箱的设置

进入QQ邮箱 -> 点击设置 -> 点击帐户
在这里插入图片描述
往下拉找到账号管理,设置发送邮件帐户(可以不设置)
在这里插入图片描述

往下拉找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,开启POP3/SMTP服务
在这里插入图片描述
开启的时候需要进行验证,毕竟是系统代发邮件(防止别人用你的邮箱发送一些广告导致封号)。
发送短信:配置邮件客户端到手机号1069 0700 69
在这里插入图片描述
然后就开启成了:
【注意***】这里会生成一个授权码(我打码了),需要备注一下,到时候连接邮箱的时候需要这个当密码。

在这里插入图片描述
在这里插入图片描述

3.2 使用邮箱发送邮件激活码到用户注册邮箱

需要导入邮箱的依赖

<!--javaMail-->
    <dependency>
      <groupId>javax.mail</groupId>
      <artifactId>javax.mail-api</artifactId>
      <version>1.5.6</version>
    </dependency>
    <dependency>
      <groupId>com.sun.mail</groupId>
      <artifactId>javax.mail</artifactId>
      <version>1.5.3</version>
    </dependency>

3.2.1 编写邮箱工具类MailUtils

这里通过QQ邮箱代发,所以需要填写参数

    //qq邮箱
    private static final String USER = "[email protected]"; // 发件人称号,同邮箱地址
    //刚刚开启生成的授权码
    private static final String PASSWORD = "你的qq邮箱开启POP3/SMTP服务生成的那个授权码"; // 如果是qq邮箱可以使户端授权码,或者登录密码

发送邮箱工具类MailUtils

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

/**
 * 发邮件工具类
 */
public final class MailUtils {
    
    
    //qq邮箱
    private static final String USER = "[email protected]"; // 发件人称号,同邮箱地址
    //刚刚开启生成的授权码
    private static final String PASSWORD = "你的qq邮箱开启POP3/SMTP服务生成的那个授权码"; // 如果是qq邮箱可以使户端授权码,或者登录密码

    /**
     *sendMail参数
     * @param1 to 收件人邮箱
     * @param2 text 邮件正文
     * @param3 title 标题
     */
    /* 发送验证信息的邮件 */
    public static boolean sendMail(String to, String text, String title){
    
    
        try {
    
    
            final Properties props = new Properties();
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.host", "smtp.qq.com");

            // 发件人的账号
            props.put("mail.user", USER);
            //发件人的密码
            props.put("mail.password", PASSWORD);

            // 构建授权信息,用于进行SMTP进行身份验证
            Authenticator authenticator = new Authenticator() {
    
    
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
    
    
                    // 用户名、密码
                    String userName = props.getProperty("mail.user");
                    String password = props.getProperty("mail.password");
                    return new PasswordAuthentication(userName, password);
                }
            };
            // 使用环境属性和授权信息,创建邮件会话
            Session mailSession = Session.getInstance(props, authenticator);
            // 创建邮件消息
            MimeMessage message = new MimeMessage(mailSession);
            // 设置发件人
            String username = props.getProperty("mail.user");
            InternetAddress form = new InternetAddress(username);
            message.setFrom(form);

            // 设置收件人
            InternetAddress toAddress = new InternetAddress(to);
            message.setRecipient(Message.RecipientType.TO, toAddress);

            // 设置邮件标题
            message.setSubject(title);

            // 设置邮件的内容体
            message.setContent(text, "text/html;charset=UTF-8");
            // 发送邮件
            Transport.send(message);
            return true;
        }catch (Exception e){
    
    
            e.printStackTrace();
        }
        return false;
    }
}

3.2.2 编写测试类测试发送邮件给指定邮箱。

public class MailUtilsTest {
    
    

    //测试发送邮箱,谁注册就发送给注册用户的邮箱
    @Test
    public void sendMail(){
    
    
        //参1:收件的邮箱  参2:邮箱内容,支持html语句,就是我们要发送的那个激活链接  参3:邮件标题
        MailUtils.sendMail("[email protected]","<a href='http://localhost:8080/TravelNetwork/activeServlet?activeCode=d9a421a341fe4ae7b2ca4ccb1062b7b8'>点击激活账户</a>","点击激活账户");
    }
}

3.2.3 测试邮箱发送和激活

  1. 测试结果:(收到激活邮箱)
    在这里插入图片描述
    在这里插入图片描述
  2. 点开邮箱可以查看发送的内容(就是那个text文本,也就是激活超链接)
    在这里插入图片描述
  3. 点击激活链接,激活成功,然后就可以正常登陆了
    在这里插入图片描述

3.2.4 将发送邮箱和激活码的代码写入注册方法中UserService的register方法

    public int register(User user) {
    
    

        //查找username是否存在,存在就返回错误,不能注册
        User u = userDao.findByUserName(user.getUsername());
        if(u == null){
    
    
            user.setStatus("N");//注册成功,但是设置为未激活
            //通过UUID获取一个激活码
            user.setCode(UuidUtil.getUuid());//生成激活码

            //参1:收件的邮箱(注册邮箱)  参2:邮箱内容,支持html语句(激活码的链接)  参3:邮件标题
            MailUtils.sendMail(user.getEmail(),"<a href='http://localhost:8080/TravelNetwork/activeServlet?activeCode="+user.getCode()+"'>点击激活账户</a>","点击激活账户");

            //保存用户注册数据
            userDao.saveUser(user);
            return 1;//未存在,可以注册
        }else {
    
    
            return 0;//已存在,不可注册
        }
    }

3.2.5 测试注册激活功能

在这里插入图片描述
注册成功收到激活邮件:
在这里插入图片描述
查看数据库,用户注册情况。
在这里插入图片描述
进入邮箱,点击激活链接激活。
在这里插入图片描述
查看数据库,激活状态变为Y了,激活成功。
在这里插入图片描述
登录测试,登录成功。
在这里插入图片描述

4. 代码地址

注册激活代码

猜你喜欢

转载自blog.csdn.net/qq_40542534/article/details/108962486