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

       

网站用户注册:

        主要实现如下两个功能:

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;

    }

}

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容

  • ActiveMQ 即时通讯服务 浅析http://www.cnblogs.com/hoojo/p/active_m...
    bboymonk阅读 1,488评论 0 11
  • 1、不安全的随机数生成,在CSRF TOKEN生成、password reset token生成等,会造成toke...
    nightmare丿阅读 3,694评论 0 1
  • package com.wiiun.web.util; import java.io.UnsupportedEnc...
    393d4e0df76e阅读 1,149评论 0 0
  • 旱冰场闪烁的灯光里,我的目光紧紧追随一个人,他的身形,他的举止,他的白衬衣,以及洋洋洒洒飞扬的刘海,都像极了一个人...
    也耳阅读 577评论 0 0
  • 今天,给儿子洗澡,他嫌水热,我给他兑上凉水之后问他:“儿子,水还热吗?” “不热了!”他淡然地说。 我心想那就好,...
    痴行人阅读 242评论 0 0