1 | 《腾讯背水一战》拼凑观点,找一堆真假参半的材料来论证, |
1.激活流程
用户提交注册表单以后(数据库添加一条数据,state=0)—–》后台向用户注册的邮箱发送激活链接(附上activeCode)—–》用户点击链接激活(state =1 )
2.技术实现
1.用户提交表单后,调用UserServlet的register方法去处理表单,如果用户注册成功,向用户发送激活邮件,跳转到注册成功页面;如果注册失败,返回失败页面。
//设置激活码
String activeCode = CommonsUtils.getUUID();
user.setCode(activeCode);
boolean registerSuccess = userService.register(user);
//是否注册成功
if(registerSuccess){
//发送激活邮件
String emailMsg = "恭喜您注册成功,请点击下面的连接进行激活账户"
+ "<a href='http://127.0.0.1:8080/Shop/active?activeCode="+activeCode+"'>"
+ "http://127.0.0.1:8080/Shop/active?activeCode="+activeCode+"</a>";
try {
MailUtils.sendMail(user.getEmail(), emailMsg);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
//跳转到注册成功页面
res.sendRedirect(req.getContextPath()+"/registerSuccess.jsp");
}else{
res.sendRedirect(req.getContextPath()+"/registerFail.jsp");
}
2.激活邮件中附带activeCode,唯一确定标识,方便判断修改哪个用户的state
String activeCode = request.getParameter("activeCode");
UserService userService = new UserService();
userService.active(activeCode);
response.sendRedirect(request.getContextPath()+"/login.jsp");
3.创建ActiveServlet去处理激活操作,定义active(activeCode)方法,调用service,service调用dao去处理。
QueryRunner queryRunner = new QueryRunner(DataSourceUtils.getDataSource());
//UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
String sql = "update user set state= ? where code = ?";
queryRunner.update(sql, 1,activeCode);
3.技术细节:
在创建用户表的时候,切记添加code和state两个字段,code用来标识用户,state用来判断用户现在的激活状态。
操作邮件时,需要借助邮件工具类。特别是对于发送qq邮件,需要添加SSL
Properties props = new Properties();
//开启ssl加密,如果没有ssl加密,会报530错误 MailSSLSocketFactory sf = null; try { sf = new MailSSLSocketFactory(); } catch (GeneralSecurityException e) { e.printStackTrace(); } sf.setTrustAllHosts(true); props.put("mail.smtp.ssl.enable", "true"); props.setProperty("mail.transport.protocol", "SMTP"); props.setProperty("mail.host", "smtp.qq.com"); props.setProperty("mail.smtp.auth", "true");// 指定验证为true
用户激活的本质是在数据库中将state字段从0变为1
$\textcolor{OrangeRed}{结尾彩蛋,附上程序员私藏壁纸:}$