运行环境
使用James邮箱服务器,需要创建相应的用户,Foxmail邮箱客户端,MySQL数据库,MyBatis框架,需要导入javax.mail.jar及javax.activation.jar。
数据库表结构
用户表t_user有五个字段分别为用户名、密码、邮箱地址、激活码、状态:
| username | password | email |code |state |
核心代码
业务实体
public class UserInfo {
private String username;
private String password;
private String email;
private String code;
private int state;
//省略getter/setter
}
数据访问接口
public interface UserDaoMapper {
public int addUser(UserInfo user); //注册用户
public int updateState(String uuid); //更新用户状态
}
MyBatis配置文件
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTDConfig 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver"value="com.mysql.jdbc.Driver" />
<property name="url"value="jdbc:mysql://localhost:3306/test" />
<property name="username"value="root" />
<property name="password"value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="wanshi/mybatis/UserDaoMapper.xml"/>
</mappers>
</configuration>
MyBatis映射文件
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="wanshi.mybatis.UserDaoMapper">
<!-- 增加用户,此功能用于注册用户的邮箱验证 -->
<insert id="addUser"parameterType="wanshi.mybatis.UserInfo">
insertinto `t_user` (`username`, `password`, `email`, `code`, `state`)values(#{username},#{password},#{email},#{code},#{state})
</insert>
<!-- 更新用户状态,用于注册验证成功后的操作 -->
<update id="updateState"parameterType="int">
updatet_user set state=1 where code=#{uuid}
</update>
</mapper>
业务逻辑接口
public interface UserBiz {
public boolean register(UserInfo user); //注册用户
public boolean active(String to,String code); //更新用户状态
//发送激活邮件
public boolean sendMail(String code);
}
业务逻辑实现UserBizImpl.java
importjava.util.Properties;
import java.util.UUID;
import javax.mail.Message;
import javax.mail.Session;
importjavax.mail.Transport;
importjavax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
importwanshi.mybatis.UserDaoMapper;
importwanshi.mybatis.UserInfo;
importwanshi.tools.MyBatisUtil;
/**
* 注册用户并发送邮件验证
* @authorAdministrator
*/
public classUserBizImpl implements UserBiz{
/**
* 注册用户,返回是否成功
*/
@Override
public booleanregister(UserInfo user) {
Boolean result=false;
String code=UUID.randomUUID().toString().replace("-", ""); //生成用户code
user.setCode(code);
int num=MyBatisUtil.getSqlSession().getMapper(UserDaoMapper.class).addUser(user); //添加用户
if(num>0){
sendMail(user.getEmail(),code); //向用户发送激活邮件
result=true;
}
return result;
}
/**
* 激活用户
*/
@Override
public booleanactive(String code) {
int num=MyBatisUtil.getSqlSession().getMapper(UserDaoMapper.class).updateState(code);
if(num>0){
return true;
}else{
return false;
}
}
/**
* 发送邮件
*/
@Override
public booleansendMail(String to, String code) {
try {
Properties props = new Properties();
props.put("username", "accp");
props.put("password", "accp");
props.put("mail.transport.protocol", "smtp" );
props.put("mail.smtp.host", "mail.com");
props.put("mail.smtp.port", "25" );
Session mailSession =Session.getDefaultInstance(props);
Message msg = new MimeMessage(mailSession);
msg.setFrom(new InternetAddress("accp@mail.com"));
msg.addRecipients(Message.RecipientType.TO,InternetAddress.parse(to));
msg.setSubject("激活邮件");
msg.setContent("<h1>此邮件为官方激活邮件!请点击下面链接完成激活操作!</h1><h3><ahref='http://localhost:8080/MyDemo/ActiveServlet?code="+code+"'>http://www.wanshi.com/MyDemo/ABCDKJK838845490SERVLET</a></h3>","text/html;charset=UTF-8");
msg.saveChanges();
Transport transport =mailSession.getTransport("smtp");
transport.connect(props.getProperty("mail.smtp.host"), props.getProperty("username"), props.getProperty("password"));
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
} catch(Exception e) {
e.printStackTrace();
System.out.println(e);
return false;
}
return true;
}
}
注册跳转的Servlet
protected void doGet(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
UserInfouser=new UserInfo(); //封装业务对象
user.setUsername(request.getParameter("username"));
user.setPassword(request.getParameter("password"));
user.setEmail(request.getParameter("email"));
UserBizub=new UserBizImpl(); //实例化业务逻辑对象
boolean isadd=ub.register(user);
response.setContentType("text/html;charset=gb2312");
if(isadd){
response.getWriter().println("注册成功,邮件已发送,请尽快进行验证!");
}else{
response.getWriter().println("注册失败!");
}
}
激活跳转的Servlet
protected void doGet(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {
//实例化业务逻辑对象
UserBizub=new UserBizImpl();
boolean isadd=ub.active(request.getParameter("code"));
System.out.println(isadd);
response.setContentType("text/html;charset=gb2312");
response.getWriter().println("恭喜,注册成功!");
}
用到的工具类
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
/**
* 获取SqlSessionFactory
* @return SqlSessionFactory
*/
public staticSqlSessionFactory getSqlSessionFactory() {
String resource = "mybatis-config.xml";
InputStream is = MyBatisUtil.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
return factory;
}
/**
* 获取SqlSession
* @return SqlSession
*/
public staticSqlSession getSqlSession() {
return getSqlSessionFactory().openSession();
}
/**
* 获取SqlSession
* @param isAutoCommit
* true 表示创建的SqlSession对象在执行完SQL之后会自动提交事务
* false 表示创建的SqlSession对象在执行完SQL之后不会自动提交事务,这时就需要我们手动调用sqlSession.commit()提交事务
* @return SqlSession
*/
public staticSqlSession getSqlSession(boolean isAutoCommit) {
return getSqlSessionFactory().openSession(isAutoCommit);
}
}
前端页面:register.jsp
<%@ page language="java"contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="c"uri="http://java.sun.com/jstl/core_rt"%>
<%
String path =request.getContextPath();
String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base href="<%=basePath%>"/>
<title>登录页面</title>
</head>
<body>
<div id="register">
<h1>欢迎登录</h1>
<form id="loginForm"method="post" action="reg">
<table>
<tr>
<td class="field">用户名:</td>
<td><input type="text" id="username"name="username" /></td>
</tr>
<tr>
<td class="field">密码:</td>
<td><input type="password" id="password"name="password" /></td>
</tr>
<tr>
<td>邮箱:</td>
<td><input type="text" id="email"name="email" /></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="submit"value="立即注册" /></td>
</tr>
</table>
</form>
</div>
</body>
</html>
当用户注册时
1、为用户生成随机的激活码(此激活码是添加根据代码规则自动生成的,这里的激活码以随机生成的UUID为例);
2、添加一条用户记录;
3、向用户发送激活邮件,此处可以添加链接直接跳转到用户邮箱登录界面。
激活邮件如下:
激活
用户点击邮箱中的链接后,系统根据用户点击链接发来的激活码去数据库中更新与该激活码匹配的用户状态,完成用户注册过程。