需求:网站注册用户时,需要填写邮箱,用户成功提交了信息后,会提示用户去邮箱激活帐号,激活后账号才能使用,否则不可以登录。
思路:
1,写一个注册页面,需要填的信息包括username,password,email,提交后会根据email给用户的邮箱发送激活的超链接。
2,提交到一个servlet处理,获取用户名和密码,提交到数据库注册,将用户信息写入数据库,定义激活状态码为active,active初始为0,代表尚未激活,这个servlet还会根据用户填写的email向用户的邮箱发送一个邮件,其中包括激活的超链接,
3,用户登录自己的邮箱,点击超链接,连接到本站的页面,通过在超链接后面追加唯一的UUID来表示一个用户,通过这个用户的UUID去数据库查询这个用户的数据,并将数据库中的active字段的值修改为1,表示已经激活,并自动跳转到首页。
4,当用户下一次登录的时候,就可以登陆了,因为已经激活。
核心代码:注册
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//编码。
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取用户填写的数据。
String username = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email");
int active = 0;
String userUUID = UUIDUtils.getUUID();
User user = new User(username, password, active, email, userUUID);
//将user提交到service层,提交到数据库注册。
//获取sql语句和参数。
String sql = "insert into users(username,password,email,active,userUUID) values(?,?,?,?,?);";
Object[] params = {username,password,email,active,userUUID};
UserService service = new UserService();
boolean isSuccess = service.addUser(sql,params);
if(isSuccess)
request.setAttribute("message", "恭喜,注册成功!");
//向用户提交的邮箱中发送一封邮件,点击邮件中的超链接激活用户,
//0.1基本参数
Properties props = new Properties();
// * 确定主机
props.setProperty("mail.host", "127.0.0.1"); //#1
// * 确定是否需要验证
props.setProperty("mail.smtp.auth", "true");
//0.2验证信息--账号与密码
Authenticator authenticator = new Authenticator(){
@Override
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("admin","1234");//#2
}
};
//1 获得会话
Session session = Session.getDefaultInstance(props, authenticator);
session.setDebug(true); //调试,可以在控制台看到发送邮件细节
//2 编写消息
Message message = new MimeMessage(session); //
try {
// 2.1 发件人
message.setFrom(new InternetAddress("admin@xzm.cn"));//#3
// 2.2 收件人 , 收取方式,to收件人,cc,抄送,bcc暗送
message.setRecipient(RecipientType.TO, new InternetAddress(email));//#4
// 2.3 主题
message.setSubject("激活");
// 2.4 正文
message.setContent("点击激活:<a href='http://localhost:8080/day16/servlet/ActiveServlet?userUUID="+userUUID+"'>" +
"http://localhost:8080/day16/servlet/ActiveServlet?userUUID="+userUUID+"</a>", "text/html;charset=UTF-8");
//3 发送邮件
Transport.send(message);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(),e);
}
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
激活servlet
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取用户userUUID,根据用户的UUID将数据库中的active值修改为1,表示已激活。
String userUUID = request.getParameter("userUUID");
//拼sql语句以及参数。
String sql = "update users set active=1 where userUUID = ?;";
Object[] params = {userUUID};
UserService service = new UserService();
int state = service.changeActive(sql,params);
//获取当前用户对象的sql语句。根据UUID
String sql2 = "select * from users where userUUID = ?;";
Object[] params2 = {userUUID};
User user = service.getUser(sql2, params2);
if(state != 0 && user != null){
request.setAttribute("message", "激活成功,3秒后跳转到首页。");
response.setHeader("refresh", "3;url=http://localhost:8080/day16/index.jsp");
request.getSession().setAttribute("user", user);
request.getRequestDispatcher("/message.jsp").forward(request,response);
} else {
request.setAttribute("message", "激活失败,重新激活");
}
}