今天看啥  ›  专栏  ›  Cherry300

spring+mybatis实现注册通过邮箱发送激活码注册用户

Cherry300  · 简书  ·  · 2019-02-04 20:50

       

网站用户注册:

        主要实现如下两个功能:

1、用户在网站上注册完成后给用户发一封邮件。

2、用户通过邮件激活后才可以登录。

思路:

首先需要一个思路:

        用户在前台点击注册,向controller提交请求,把用户提交过来的信息封装成一个user(需要的信息有name,pwd,email这3个是用户填写的,我们帮用户生成的是id和一个邮箱激活链接地址的唯一标识码acode,还要一个用来识别用户是否已经点击链接的变量active)。 如果用户点击了链接后,我们会将用户的状态修改为true【对应的“”1”】,当我们登入时,会根据返会的actived状态,来判断用户是否已经激活了账户,若未激活,则登录不进去,否则,则可以;

        并且不能使用该邮箱重复注册用户,所以每次注册用户时,都会先通过邮箱查询该邮箱是否已经注册过了,没有,则可以注册,否则不行。

        用户点了激活链接后,再自动跳转到登录页面!

1:.POM.xml中导入javaxmail需要的依赖

2:controller类

package com.chinasofti.controller;

import com.chinasofti.pojo.User;

import com.chinasofti.service.UserService;

import com.chinasofti.util.EmailUtils;

import com.chinasofti.util.GenerateLinkUtils;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import java.io.IOException;

import java.util.UUID;

@Controller

@RequestMapping("email")

public class UserController {

    @Autowired

    private UserService userService;

    @RequestMapping("toregist")

    public String toemail() {

        return "regist";

    }

@RequestMapping("login")

public  String login(){

        return "login";

}

    @RequestMapping("/regist")

    public void regist(User user, HttpSession httpSession, HttpServletResponse response) {

        user.setActivated(false);  //刚注册默认是没有激活状态

        user.setCodeUrl(UUID.randomUUID().toString());

        //注册用户

        User user1=userService.findUserByEmail(user.getEmail());

        if (user1==null) {

            userService.saveUser(user);

        } else {

            throw new RuntimeException("该邮箱已注册");

        }

        //查看是否注册成功,为实体类User的id赋值

        User findUser = userService.findUserByEmail(user.getEmail());

        if (findUser != null) {

            user.setId(findUser.getId());

        } else {

            throw new RuntimeException("注册用户失败");

        }

        //注册成功后,发送账户激活链接

        httpSession.setAttribute("user", user);

        EmailUtils.sendAccountActivateEmail(user);

        try {

            response.setContentType("text/html;charset=utf-8");

            response.getWriter().write("激活邮件已经发送,请注意提醒查收");

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

    @RequestMapping("/activate")

    public void activate(String id, String checkCode, HttpServletResponse response) {

        int idInt = Integer.parseInt(id);

        //根据用户id查找用户

        User user = userService.findUserById(idInt);

        //验证无误,状态更改为1,即激活

        if (GenerateLinkUtils.verifyCheckcode(user, checkCode)) {

            //修改状态

            int activated = 1;

            userService.updateActivated(activated, idInt);

            user.setActivated(true);

            try {

                response.setContentType("text/html;charset=utf-8");

                response.getWriter().write("恭喜,激活成功!");

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

}

3:service类

package com.chinasofti.service;

import com.chinasofti.dao.UserDao;

import com.chinasofti.pojo.User;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

@Service

public class UserService {

    @Autowired

    private UserDao userDao;

    public void saveUser(User user) {

        userDao.saveUser(user);

    }

    public User findUserByEmail(String email) {

        return  userDao.findUserByEmail(email);

       

    }

    public User findUserById(int idInt) {

        return  userDao.findUserById(idInt);

    }

    public void updateActivated(int activated, int idInt) {

        userDao.updateActivated(activated,idInt);

    }

}

4:dao层

package com.chinasofti.dao;

import com.chinasofti.pojo.User;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Repository;

@Repository

public class UserDao {

    @Autowired

    private UserMapper userMapper;

    public User findUserByEmail(String email) {

        return  userMapper.findUserByEmail(email);

    }

    public User findUserById(int idInt) {

        return  userMapper.findUserById(idInt);

    }

    public void saveUser(User user) {

        userMapper.saveUser(user);

    }

    public void updateActivated(int activated, int idInt) {

        userMapper.updateActivated(activated,idInt);

    }

}

5:register.jsp页面

<%@ page language="java" contentType="text/html; charset=utf-8"

        pageEncoding="utf-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

    <title>注册</title>

</head>

<body>

<form action="/email/regist" 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="email"/></td></tr>

        <tr><td colspan="2"><input type="submit" value="注册"/></td></tr>

    </table>

</form>

</body>

</html>

</body>

</html>

6:User实体类

package com.chinasofti.pojo;

public class User {

    private int id;

    private String username;

    private String password;

    private String email;

    private boolean activated;  //账号状态

    private String codeUrl;      //激活链接中的随机码

    public int getId() {

        return id;

    }

    public void setId(int id) {

        this.id = id;

    }

    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 getEmail() {

        return email;

    }

    public void setEmail(String email) {

        this.email = email;

    }

    public boolean isActivated() {

        return activated;

    }

    public void setActivated(boolean activated) {

        this.activated = activated;

    }

    public String getCodeUrl() {

        return codeUrl;

    }

    public void setCodeUrl(String codeUrl) {

        this.codeUrl = codeUrl;

    }

}

  7:mapper.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 -->

<mapper namespace="com.chinasofti.dao.UserMapper">

    <!-- 指定属性与列的对应关系 -->

    <resultMap id="userMapper" type="com.chinasofti.pojo.User">

        <result property="id" column="id"></result>

        <result property="username" column="username"></result>

        <result property="password" column="passwordv"></result>

        <result property="email" column="email"></result>

        <result property="activated" column="activated"></result>

        <result property="codeUrl" column="codeUrl"></result>

    </resultMap>

    <insert id="saveUser">

        INSERT  INTO users VALUES (#{id},#{username},#{password},#{email},#{activated},#{codeUrl})

    </insert>

    <select id="findUserByEmail" resultMap="userMapper">

        SELECT  * FROM  users WHERE  email=#{email}

    </select>

    <select id="findUserById" resultMap="userMapper">

        SELECT  * from users WHERE  id=#{idInt}

    </select>

    <update id="updateActivated">

        UPDATE users SET activated=#{activated} WHERE  id=#{idInt}

    </update>

    </mapper>

8:EmailUtils工具类:

package com.chinasofti.util;

import com.chinasofti.pojo.User;

import java.util.Date;

import java.util.Properties;

import javax.mail.Authenticator;

import javax.mail.MessagingException;

import javax.mail.PasswordAuthentication;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

import javax.mail.internet.MimeMessage.RecipientType;

public class EmailUtils {

    private static final String FROM = "zhouliangmet@163.com";

    public static void sendAccountActivateEmail(User user) {

        Session session = getSession();

        MimeMessage message = new MimeMessage(session);

        try {

            message.setSubject("这是一封激活账号的邮件");

            message.setSentDate(new Date());

            //setFrom 表示用哪个邮箱发送邮件

            message.setFrom(new InternetAddress(FROM));

            /**

            * RecipientType.TO||BCC||CC

            *    TO表示主要接收人

            *    BCC表示秘密抄送人

            *    CC表示抄送人

            * InternetAddress  接收者的邮箱地址

            */

            message.setRecipient(RecipientType.TO, new InternetAddress(user.getEmail()));

            message.setContent("<a target='_BLANK' href='"+GenerateLinkUtils.generateActivateLink(user)+"'>"+user.getUsername()+"先生/女士您好,请点击此链接激活账号"+GenerateLinkUtils.generateActivateLink(user)

        +"</a>","text/html;charset=utf-8");

//            message.setContent("<a target='_BLANK' href='http://www.baidu.com'>" + user.getUsername() + "先生/女士您好,请点击此链接激活账号" + GenerateLinkUtils.generateActivateLink(user)

//                    + "</a>", "text/html;charset=utf-8");

            Transport.send(message);

        } catch (MessagingException e) {

            e.printStackTrace();

        }

    }

    public static Session getSession() {

        Properties props = new Properties();

        props.setProperty("mail.transport.protocol", "smtp");//指定发送的邮箱的邮箱协议

        props.setProperty("mail.smtp.host", "smtp.163.com");//指定SMTP服务器

        props.setProperty("mail.smtp.port", "25");  //smtp是发信邮件服务器,端口是25

        props.setProperty("mail.smtp.auth", "true");//指定是否需要SMTP验证

        Session session = Session.getInstance(props, new Authenticator() {

            @Override

            protected PasswordAuthentication getPasswordAuthentication() {

                return new PasswordAuthentication(FROM, "98liang032");

            }

        });

        return session;

    }

}

9:GenerateLinkUtils:

package com.chinasofti.util;

import com.chinasofti.pojo.User;

import java.util.Date;

import java.util.Properties;

import javax.mail.Authenticator;

import javax.mail.MessagingException;

import javax.mail.PasswordAuthentication;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

import javax.mail.internet.MimeMessage.RecipientType;

public class EmailUtils {

    private static final String FROM = "**********@163.com";

    public static void sendAccountActivateEmail(User user) {

        Session session = getSession();

        MimeMessage message = new MimeMessage(session);

        try {

            message.setSubject("这是一封激活账号的邮件");

            message.setSentDate(new Date());

            //setFrom 表示用哪个邮箱发送邮件

            message.setFrom(new InternetAddress(FROM));

            /**

            * RecipientType.TO||BCC||CC

            *    TO表示主要接收人

            *    BCC表示秘密抄送人

            *    CC表示抄送人

            * InternetAddress  接收者的邮箱地址

            */

            message.setRecipient(RecipientType.TO, new InternetAddress(user.getEmail()));

            message.setContent("<a target='_BLANK' href='"+GenerateLinkUtils.generateActivateLink(user)+"'>"+user.getUsername()+"先生/女士您好,请点击此链接激活账号"+GenerateLinkUtils.generateActivateLink(user)

        +"</a>","text/html;charset=utf-8");

//            message.setContent("<a target='_BLANK' href='http://www.baidu.com'>" + user.getUsername() + "先生/女士您好,请点击此链接激活账号" + GenerateLinkUtils.generateActivateLink(user)

//                    + "</a>", "text/html;charset=utf-8");

            Transport.send(message);

        } catch (MessagingException e) {

            e.printStackTrace();

        }

    }

    public static Session getSession() {

        Properties props = new Properties();

        props.setProperty("mail.transport.protocol", "smtp");//指定发送的邮箱的邮箱协议

        props.setProperty("mail.smtp.host", "smtp.163.com");//指定SMTP服务器

        props.setProperty("mail.smtp.port", "25");  //smtp是发信邮件服务器,端口是25

        props.setProperty("mail.smtp.auth", "true");//指定是否需要SMTP验证

        Session session = Session.getInstance(props, new Authenticator() {

            @Override

            protected PasswordAuthentication getPasswordAuthentication() {

                return new PasswordAuthentication(FROM, "***********");//该地方是填写客户端的授权码

            }

        });

        return session;

    }

}

        以上代码本人已亲测过,能够正常访问,代码较多,请耐心分析,解读!!!!




原文地址:访问原文地址
快照地址: 访问文章快照