功能设计:
架构设计:
注册时通过发送邮件方式,传递访问项目激活的servlet进行改写数据库中active的值,通过传递激活码acode来辨别数据库中是否有该账户信息
注册功能实现:
servlet:
package cn.hncu.reg.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
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.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.hncu.domain.User;
import cn.hncu.reg.service.RegService;
import cn.hncu.reg.service.RegServiceimpl;
import cn.hncu.utils.SendMailThread;
public class RegServlet extends HttpServlet {
RegService service = new RegServiceimpl();
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
String email = request.getParameter("email");
User user = new User();
user.setName(name);
user.setPwd(pwd);
user.setEmail(email);
try {
user = service.reg(user);
if (user != null) {
// 发激活邮件
new SendMailThread(user).start();
out.println("您已经成功注册,请到邮箱中激活");
} else {
out.println("注册失败");
}
} catch (SQLException e) {
out.println("注册失败");
}
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
dao:
package cn.hncu.reg.dao;
import java.sql.SQLException;
import java.util.UUID;
import org.apache.commons.dbutils.QueryRunner;
import cn.hncu.domain.User;
import cn.hncu.utils.C3p0Utils;
public class RegDAOimpl implements RegDAO {
@Override
public User reg(User user) throws SQLException {
String sql = "insert into users(id,name,pwd,email,active,acode) values(?,?,?,?,?,?)";
QueryRunner run = new QueryRunner(C3p0Utils.getComboPooledDataSource());
String id = UUID.randomUUID().toString().replace("-", "");
String acode = UUID.randomUUID().toString().replace("-", "");
int n = run.update(sql, id, user.getName(), user.getPwd(),
user.getEmail(), "0", acode);
if (n > 0) {
user.setId(id);
user.setActive("0");
user.setAcode(acode);
return user;
} else {
return null;
}
}
}
sendMailutils:
package cn.hncu.utils;
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.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import org.apache.log4j.Logger;
import cn.hncu.domain.User;
public class SendMailThread extends Thread{
Logger log = Logger.getLogger(SendMailThread.class);
private User user=null;
public SendMailThread(User user) {
this.user = user;
}
@Override
public void run() {
try {
Properties p = new Properties();
p.setProperty("mail.host", "smtp.sina.com");
p.setProperty("mail.smtp.auth", "true");//认证登录
Session session = Session.getDefaultInstance(p, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("hncujava","hncu1234567");
}
});
session.setDebug(true);//以debug方式(应答方式)进行通讯
//准备邮件
MimeMessage msg = new MimeMessage(session); //从session中创建邮件
msg.setFrom( new InternetAddress("hncujava@sina.com") );
msg.setRecipient(RecipientType.TO, new InternetAddress( user.getEmail() ) );※※※
msg.setSubject("账号激活邮件,城院公司欢迎你!");
String info = "激活:<a href='http://127.0.0.1:8080/mailWeb1602/ActiveServlet?acode="+user.getAcode()+"'>激活</a>";
info = info + "<br/>如果激活未成功,请把地址复制到浏览器进行手动请求以进行激活:http://127.0.0.1:8080/mailWeb1602/ActiveServlet?acode="+user.getAcode();
msg.setContent(info, "text/html;charset=utf-8");
msg.setSentDate( new Date() );
//发送邮件
Transport.send(msg);
log.info("邮件成功发送到:"+user.getEmail());
} catch (Exception e) {
log.error("邮件发送失败,邮箱地址为:"+user.getEmail());
//e.printStackTrace();
}
}
}
result.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script type="text/javascript">
var i = 4;
function a() {
i--;
div1.innerHTML = i + "秒钟之后自动登录";
if (i <= 1) {
window.clearInterval(tm);
window.location.href = "<c:url value='/index.jsp'/>";
}
}
</script>
</head>
<body>
<c:if test="${boo }">
激活成功
<a href="<c:url value='/index.jsp'/>">返回登录页面</a>
<div id="div1"></div>
<script type="text/javascript">
tm = window.setInterval(aa, 1000);
</script>
</c:if>
<c:if test="${!boo }">
激活不成功,请检查激活码,或另择时间再激活
</c:if>
</body>
</html>
“`