注册时邮箱激活验证

前期需要做的准备是:把邮件发送者开通SMTP授权,用记事本保存好授权码,因为程序中要用。

  1. 先在数据库用户表中增加两个字段一个是表示登入状态的status,一个是激活码字段code
  2. 邮件发送:
    ①点击注册的时候,在业务层先查询用户信息是否存在,如果不存在则到第二步。
    ②第一,将用户密码进行加密处理(用到的是MD5算法+为了增加密码难度,可以在密码后面拼接盐值)加密是为了密码的安全性,2011年CSDN曾应为密码是明文的,出现过大量用户数据泄露的重大问题。
    ③第二,将登入状态设置为0,然后动态生成一个16位的激活码,将信息添加到数据库的同时给你的邮箱发送一封激活邮件(邮件内容采用的HTML格式的url,拼接了激活码参数,目的是为了用户点击激活链接时,会给后台发出带激活码的请求,业务层对进行验证授权登入)当中添加了事务处理,当两个操作有一个出异常,会回滚事务,关于邮件发送用到的是javaMailAPI,是用来发送电子邮件的API,发送邮件的协议是SMTP,接收协议的是pop3,核心是session,Message,Address,Authenticator,Transport。
  3. 点击激活链接:当台接收到激活码参数
    ①首先查询是否存在用户信息。
    ②若是有用户信息,在判断用户信息的激活码是否为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";
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值