spring+mybatis實(shí)現(xiàn)注冊通過郵箱發(fā)送激活碼注冊用戶

? ? ? ?

網(wǎng)站用戶注冊:

? ? ? ? 主要實(shí)現(xiàn)如下兩個(gè)功能:

1枪眉、用戶在網(wǎng)站上注冊完成后給用戶發(fā)一封郵件。

2贪绘、用戶通過郵件激活后才可以登錄炎咖。

思路:

首先需要一個(gè)思路:

? ? ? ? 用戶在前臺點(diǎn)擊注冊,向controller提交請求来农,把用戶提交過來的信息封裝成一個(gè)user(需要的信息有name,pwd,email這3個(gè)是用戶填寫的,我們幫用戶生成的是id和一個(gè)郵箱激活鏈接地址的唯一標(biāo)識碼acode鞋真,還要一個(gè)用來識別用戶是否已經(jīng)點(diǎn)擊鏈接的變量active)。 如果用戶點(diǎn)擊了鏈接后沃于,我們會將用戶的狀態(tài)修改為true【對應(yīng)的“”1”】涩咖,當(dāng)我們登入時(shí),會根據(jù)返會的actived狀態(tài)繁莹,來判斷用戶是否已經(jīng)激活了賬戶檩互,若未激活,則登錄不進(jìn)去咨演,否則闸昨,則可以;

? ? ? ? 并且不能使用該郵箱重復(fù)注冊用戶薄风,所以每次注冊用戶時(shí)饵较,都會先通過郵箱查詢該郵箱是否已經(jīng)注冊過了,沒有遭赂,則可以注冊循诉,否則不行。

? ? ? ? 用戶點(diǎn)了激活鏈接后撇他,再自動(dòng)跳轉(zhuǎn)到登錄頁面茄猫!

1:.POM.xml中導(dǎo)入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);? //剛注冊默認(rèn)是沒有激活狀態(tài)

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

? ? ? ? //注冊用戶

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

? ? ? ? if (user1==null) {

? ? ? ? ? ? userService.saveUser(user);

? ? ? ? } else {

? ? ? ? ? ? throw new RuntimeException("該郵箱已注冊");

? ? ? ? }

? ? ? ? //查看是否注冊成功,為實(shí)體類User的id賦值

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

? ? ? ? if (findUser != null) {

? ? ? ? ? ? user.setId(findUser.getId());

? ? ? ? } else {

? ? ? ? ? ? throw new RuntimeException("注冊用戶失敗");

? ? ? ? }

? ? ? ? //注冊成功后逆粹,發(fā)送賬戶激活鏈接

? ? ? ? httpSession.setAttribute("user", user);

? ? ? ? EmailUtils.sendAccountActivateEmail(user);

? ? ? ? try {

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

? ? ? ? ? ? response.getWriter().write("激活郵件已經(jīng)發(fā)送募疮,請注意提醒查收");

? ? ? ? } catch (IOException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? }

? ? @RequestMapping("/activate")

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

? ? ? ? int idInt = Integer.parseInt(id);

? ? ? ? //根據(jù)用戶id查找用戶

? ? ? ? User user = userService.findUserById(idInt);

? ? ? ? //驗(yàn)證無誤,狀態(tài)更改為1僻弹,即激活

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

? ? ? ? ? ? //修改狀態(tài)

? ? ? ? ? ? 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實(shí)體類

package com.chinasofti.pojo;

public class User {

? ? private int id;

? ? private String username;

? ? private String password;

? ? private String email;

? ? private boolean activated;? //賬號狀態(tài)

? ? private String codeUrl;? ? ? //激活鏈接中的隨機(jī)碼

? ? 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節(jié)點(diǎn)必須指定namespace -->

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

? ? <!-- 指定屬性與列的對應(yīng)關(guān)系 -->

? ? <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 表示用哪個(gè)郵箱發(fā)送郵件

? ? ? ? ? ? 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()+"先生/女士您好蹋绽,請點(diǎn)擊此鏈接激活賬號"+GenerateLinkUtils.generateActivateLink(user)

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

//? ? ? ? ? ? message.setContent("<a target='_BLANK' + user.getUsername() + "先生/女士您好芭毙,請點(diǎn)擊此鏈接激活賬號" + 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");//指定發(fā)送的郵箱的郵箱協(xié)議

? ? ? ? props.setProperty("mail.smtp.host", "smtp.163.com");//指定SMTP服務(wù)器

? ? ? ? props.setProperty("mail.smtp.port", "25");? //smtp是發(fā)信郵件服務(wù)器,端口是25

? ? ? ? props.setProperty("mail.smtp.auth", "true");//指定是否需要SMTP驗(yàn)證

? ? ? ? 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 表示用哪個(gè)郵箱發(fā)送郵件

? ? ? ? ? ? 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()+"先生/女士您好筋蓖,請點(diǎn)擊此鏈接激活賬號"+GenerateLinkUtils.generateActivateLink(user)

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

//? ? ? ? ? ? message.setContent("<a target='_BLANK' + user.getUsername() + "先生/女士您好,請點(diǎn)擊此鏈接激活賬號" + 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");//指定發(fā)送的郵箱的郵箱協(xié)議

? ? ? ? props.setProperty("mail.smtp.host", "smtp.163.com");//指定SMTP服務(wù)器

? ? ? ? props.setProperty("mail.smtp.port", "25");? //smtp是發(fā)信郵件服務(wù)器,端口是25

? ? ? ? props.setProperty("mail.smtp.auth", "true");//指定是否需要SMTP驗(yàn)證

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

? ? ? ? ? ? @Override

? ? ? ? ? ? protected PasswordAuthentication getPasswordAuthentication() {

? ? ? ? ? ? ? ? return new PasswordAuthentication(FROM, "***********");//該地方是填寫客戶端的授權(quán)碼

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? return session;

? ? }

}

? ? ? ? 以上代碼本人已親測過退敦,能夠正常訪問粘咖,代碼較多,請耐心分析侈百,解讀N拖隆!6塾颉讽坏!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市例证,隨后出現(xiàn)的幾起案子路呜,更是在濱河造成了極大的恐慌,老刑警劉巖织咧,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胀葱,死亡現(xiàn)場離奇詭異,居然都是意外死亡笙蒙,警方通過查閱死者的電腦和手機(jī)抵屿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捅位,“玉大人晌该,你說我怎么就攤上這事÷淘” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵燕耿,是天一觀的道長中符。 經(jīng)常有香客問我,道長誉帅,這世上最難降的妖魔是什么淀散? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蚜锨,結(jié)果婚禮上档插,老公的妹妹穿的比我還像新娘。我一直安慰自己亚再,他們只是感情好郭膛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著氛悬,像睡著了一般则剃。 火紅的嫁衣襯著肌膚如雪耘柱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天棍现,我揣著相機(jī)與錄音调煎,去河邊找鬼。 笑死己肮,一個(gè)胖子當(dāng)著我的面吹牛士袄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谎僻,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼娄柳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了戈稿?” 一聲冷哼從身側(cè)響起西土,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鞍盗,沒想到半個(gè)月后需了,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡般甲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年肋乍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敷存。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡墓造,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锚烦,到底是詐尸還是另有隱情觅闽,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布涮俄,位于F島的核電站蛉拙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏彻亲。R本人自食惡果不足惜孕锄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苞尝。 院中可真熱鬧畸肆,春花似錦、人聲如沸宙址。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至豁辉,卻和暖如春令野,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背徽级。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工气破, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人餐抢。 一個(gè)月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓现使,卻偏偏與公主長得像,于是被迫代替她去往敵國和親旷痕。 傳聞我的和親對象是個(gè)殘疾皇子碳锈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • ActiveMQ 即時(shí)通訊服務(wù) 淺析http://www.cnblogs.com/hoojo/p/active_m...
    bboymonk閱讀 1,490評論 0 11
  • 1、不安全的隨機(jī)數(shù)生成欺抗,在CSRF TOKEN生成售碳、password reset token生成等,會造成toke...
    nightmare丿閱讀 3,698評論 0 1
  • package com.wiiun.web.util; import java.io.UnsupportedEnc...
    393d4e0df76e閱讀 1,160評論 0 0
  • 旱冰場閃爍的燈光里,我的目光緊緊追隨一個(gè)人佃声,他的身形艺智,他的舉止,他的白襯衣圾亏,以及洋洋灑灑飛揚(yáng)的劉海十拣,都像極了一個(gè)人...
    也耳閱讀 577評論 0 0
  • 今天,給兒子洗澡志鹃,他嫌水熱夭问,我給他兌上涼水之后問他:“兒子,水還熱嗎曹铃?” “不熱了甲喝!”他淡然地說。 我心想那就好铛只,...
    癡行人閱讀 242評論 0 0