前期需要做的准备是:把邮件发送者开通SMTP授权,用记事本保存好授权码,因为程序中要用。
- 先在数据库用户表中增加两个字段一个是表示登入状态的status,一个是激活码字段code
- 邮件发送:
①点击注册的时候,在业务层先查询用户信息是否存在,如果不存在则到第二步。
②第一,将用户密码进行加密处理(用到的是MD5算法+为了增加密码难度,可以在密码后面拼接盐值)加密是为了密码的安全性,2011年CSDN曾应为密码是明文的,出现过大量用户数据泄露的重大问题。
③第二,将登入状态设置为0,然后动态生成一个16位的激活码,将信息添加到数据库的同时给你的邮箱发送一封激活邮件(邮件内容采用的HTML格式的url,拼接了激活码参数,目的是为了用户点击激活链接时,会给后台发出带激活码的请求,业务层对进行验证授权登入)当中添加了事务处理,当两个操作有一个出异常,会回滚事务,关于邮件发送用到的是javaMailAPI,是用来发送电子邮件的API,发送邮件的协议是SMTP,接收协议的是pop3,核心是session,Message,Address,Authenticator,Transport。 - 点击激活链接:当台接收到激活码参数
①首先查询是否存在用户信息。
②若是有用户信息,在判断用户信息的激活码是否为null,若为null的话则说明用户激活认证过了。
③若不为null则判断当前时间到注册的时间差,当超过规定的的时间的话,则删除用户数据库信息,将页面跳转到注册页面,提醒用户重新注册,若没有超出时间,则将将用户的登入状态改为1,激活码改为null。
(这里关于设置时效时间的目的1.节省资源时效的信息会被处理掉,2.增加安全性,减少被盗用的风险,3.如果网站的注册登入机制发生变化,方式出现过期的链接出现错误)
邮件发送工具类
package com.cy.pj.util;
import java.util.Date;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
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;
public class SendEmail {
public static void sendEmail(String sendEmailAccount,String code) {
// 发件人电子邮箱
String receiveMailAccount = "xxxxxxxx@qq.com";
// 指定发送邮件的主机为 smtp.qq.com
String host = "smtp.qq.com"; //QQ 邮件服务器
// 获取系统属性
Properties properties = System.getProperties();//参数配置
// 设置邮件服务器
properties.setProperty("mail.smtp.host", host);//发件人的邮箱SMTP
properties.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
properties.put("mail.smtp.auth", "true");
properties.setProperty("mail.smtp.ssl.enable","true");
properties.setProperty("mail.debug", "true");// 设置为debug模式, 可以查看详细的发
// 获取默认session对象
Session session = Session.getInstance(properties,new Authenticator(){
public PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication("xxxxxxxx@qq.com", "xxxxxxxxxxxxxxx"); //发件人邮件用户名、授权码
}
});
try{
// 创建默认的 MimeMessage 对象
MimeMessage message = new MimeMessage(session);
// Set From: 头部头字段
message.setFrom(new InternetAddress(receiveMailAccount));
// Set To: 头部头字段
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(sendEmailAccount));
// Set Subject: 头部头字段
message.setSubject("订餐网站激活邮件");
//设置邮件主题
message.setContent("<h1>来自订餐网站激活链接,激活请点击以下链接:<a href='http://localhost/resigter/activation?code="+code+"'>http://localhost/resigter/activation?code="+code+"</a></h1>","text/html;charset=UTF-8");
//
message.setSentDate(new Date());
Transport.send(message);
}catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
注册时向用户邮箱发送激活邮件的业务
import org.springframework.transaction.annotation.Transactional;
@Override
@Transactional //开启事务
public int saveUser(SysUser sysUser) {
if(sysUser==null)
throw new IllegalArgumentException("保存对象不能为空");
if(StringUtils.isEmpty(sysUser.getUsername()))
throw new IllegalArgumentException("用户名不能为空");
if(sysUserDao.findObjectsByName(sysUser.getUsername())!=null)
throw new IllegalArgumentException("该用户已存在");
if(StringUtils.isEmpty(sysUser.getPassword()))
throw new IllegalArgumentException("请填写账号密码");
//盐值
String salt=UUID.randomUUID().toString();
sysUser.setSalt(salt);
//MD5算法加密
SimpleHash sHash=new SimpleHash("MD5",sysUser.getPassword(), salt,1);
sysUser.setPassword(sHash.toHex());
//设置登入状态和激活码
sysUser.setStatus(0);
String newsalt=UUID.randomUUID().toString();
String code = newsalt.replace("-", "");
sysUser.setCode(code);
int rows=sysUserDao.insertObject(sysUser);
String sendEmailAccount = sysUser.getMail();
//发送激活邮件
SendEmail.sendEmail(sendEmailAccount, code);
//3.返回结果
return rows;
}
邮箱激活链接验证的业务
package com.cy.pj.stof.controller;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.cy.pj.common.exception.ServiceException;
import com.cy.pj.stof.entity.SysUser;
import com.cy.pj.stof.service.EmailActivityservice;
import com.cy.pj.stof.service.SysUserService;
@Controller
@RequestMapping("resigter")
public class activtionController {
@Autowired //自动注入
private EmailActivityservice emailActivityservice;
@Autowired
private SysUserService sysUserService;
@RequestMapping("activation")
public String activation(String code) {
Date date = new Date();
SysUser user = emailActivityservice.findUserByCode(code);
if(user!=null) {
if(date.getTime()-user.getCreated().getTime()>1000*60) {//这里设置了时效为1分钟
int row=sysUserService.deleteById(user.getId()); //若失效则要删除数据库中记录
throw new ServiceException("链接已失效,请重新注册");
}
user.setStatus(1); //设置为可登入
user.setCode(null); //设置
int row = emailActivityservice.updateStatus(user);
if(row>0)
return "registersuccess";
}
return "register";
}
}