注册
- 分析
- 前端js
//当表单提交时,调用所有的校验方法
$("#registerForm").submit(function () {
//表单校验
if (checkUsername() && checkPassword() && checkEmail() && checkName() && checkPhone() && checkBirthday() && check()) {
$.post("registerUserServlet", $(this).serialize(), function (data) {
//处理服务器响应的数据
if (data.flag) {
location.href="register_ok.html";
}else {
$("#errorMsg").html(data.errorMsg)
}
}, "json")
}
//调用校验
return false;
});
//当某一个组件失去焦点时,调用对应的校验方法
$("#username").blur(checkUsername);
$("#password").blur(checkPassword);
$("#email").blur(checkEmail);
$("#name").blur(checkName);
$("#telephone").blur(checkPhone);
$("#birthday").blur(checkBirthday);
$("#check").blur(check);
- Servlet
//接收数据
Map<String, String[]> map = request.getParameterMap();
//获取验证码
String check = request.getParameter("check");
//封装数据
User user = new User();
try {
BeanUtils.populate(user, map);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
//从session中获取验证码
HttpSession session = request.getSession();
String checkcodeServer = (String) session.getAttribute("CHECKCODE_SERVER");
session.setAttribute("CHECKCODE_SERVER", "");
//验证验证码
ResultInfo info = new ResultInfo();
boolean flag = false;
String errorMsg = null;
if (check != null && !"".equals(check) && checkcodeServer != null && !"".equals(checkcodeServer) && checkcodeServer.equalsIgnoreCase(check)) {
//调用service完成注册
UserService userService = new UserServiceImpl();
flag = userService.regist(user);
if (!flag) {
//注册失败
errorMsg = "注册失败";
}
} else {
//响应结果
errorMsg = "验证码已过期";
}
//响应结果
info.setFlag(flag);
info.setErrorMsg(errorMsg);
//序列化info
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(info);
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json);
- Service
/**
* 用户注册
*
* @param user 用户注册信息
* @return 是否成功标记
*/
@Override
public boolean regist(User user) {
//根据用户名查询用户对象
User newUser = dao.findByUserName(user.getUsername());
if (newUser != null) {
return false;
}
//保存用户信息
//设置激活码
user.setCode(UuidUtil.getUuid());
//设置用户状态
user.setStatus("N");
dao.save(user);
//邮件发送
String content = "<a href='http://localhost/travel/activeUserServlet?code=" + user.getCode() + "'>点击激活[乡村黑猪]</a>";
MailUtils.sendMail(user.getEmail(), content, "[乡村黑猪激活邮件]");
return true;
}
- Dao
/**
* 根据用户名查询用户信息
*
* @param username 用户名
* @return 用户信息
*/
@Override
public User findByUserName(String username) {
String sql = "select * from tab_user where username=?";
User user = null;
try {
user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username);
} catch (DataAccessException e) {
// e.printStackTrace();
}
return user;
}
/**
* @param user 用户信息
*/
@Override
public void save(User user) {
String sql = "insert into tab_user(username,password,name,birthday,sex,telephone,email,status,code) values(?,?,?,?,?,?,?,?,?)";
template.update(sql, user.getUsername(), user.getPassword(), user.getName(),
user.getBirthday(), user.getSex(), user.getTelephone(), user.getEmail(), user.getStatus(), user.getCode());
}
发送邮件
- 为什么要进行邮件激活?
为了保证用户填写的邮件是正确的,将来可以进行密码找回等功能实现. - 通过MailUtils工具类实现
package cn.itcast.travel.util;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
/**
* 发邮件工具类
*/
public final class MailUtils {
private static final String USER = ""; // 发件人称号,同邮箱地址
private static final String PASSWORD = ""; // 如果是qq邮箱可以使户端授权码,或者登录密码
/**
*
* @param to 收件人邮箱
* @param text 邮件正文
* @param title 标题
*/
/* 发送验证信息的邮件 */
public static boolean sendMail(String to, String text, String title){
try {
final Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", "smtp.qq.com");
// 发件人的账号
props.put("mail.user", USER);
//发件人的密码
props.put("mail.password", PASSWORD);
// 构建授权信息,用于进行SMTP进行身份验证
Authenticator authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 用户名、密码
String userName = props.getProperty("mail.user");
String password = props.getProperty("mail.password");
return new PasswordAuthentication(userName, password);
}
};
// 使用环境属性和授权信息,创建邮件会话
Session mailSession = Session.getInstance(props, authenticator);
// 创建邮件消息
MimeMessage message = new MimeMessage(mailSession);
// 设置发件人
String username = props.getProperty("mail.user");
InternetAddress form = new InternetAddress(username);
message.setFrom(form);
// 设置收件人
InternetAddress toAddress = new InternetAddress(to);
message.setRecipient(Message.RecipientType.TO, toAddress);
// 设置邮件标题
message.setSubject(title);
// 设置邮件的内容体
message.setContent(text, "text/html;charset=UTF-8");
// 发送邮件
Transport.send(message);
return true;
}catch (Exception e){
e.printStackTrace();
}
return false;
}
public static void main(String[] args) throws Exception { // 做测试用
MailUtils.sendMail("itcast_xian@163.com","你好,这是一封测试邮件,无需回复。","测试邮件");
System.out.println("发送成功");
}
}
- 在163邮箱或QQ邮箱开通授权码
注意:根据不同的发送邮箱配置不同的服务器(163邮箱为smtp.163.com)
final Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", "smtp.qq.com");//修改值,现在写的qq的SMTP服务器
- 注册流程
- User类(未给出set,get方法)
public class User implements Serializable {
/**
* 用户id
*/
private int uid;
/**
* 用户名,账号
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 真实姓名
*/
private String name;
/**
* 出生日期
*/
private String birthday;
/**
* 男或女
*/
private String sex;
/**
* 手机号
*/
private String telephone;
/**
* 邮箱
*/
private String email;
/**
* 激活状态,Y代表激活,N代表未激活
*/
private String status;
/**
* 激活码(要求唯一)
*/
private String code;
}
- Service
/**
* 用户注册
*
* @param user 用户注册信息
* @return 是否成功标记
*/
@Override
public boolean regist(User user) {
//根据用户名查询用户对象
User newUser = dao.findByUserName(user.getUsername());
if (newUser != null) {
return false;
}
//保存用户信息
//设置激活码
user.setCode(UuidUtil.getUuid());
//设置用户状态
user.setStatus("N");
dao.save(user);
//邮件发送
String content = "<a href='http://localhost/travel/activeUserServlet?code=" + user.getCode() + "'>点击激活[乡村黑猪]</a>";
MailUtils.sendMail(user.getEmail(), content, "[乡村黑猪激活邮件]");
return true;
}
}
- Status为"N"为未激活,为"Y"为已激活
- 在用户注册时就进行激活码的生成和保存,然后进行邮件的发送
用户点击邮件激活
-
分析
-
Servlet
//获取Code
String code = request.getParameter("code");
boolean flag = false;
//判空
if (code != null && !"".equals(code)) {
//调用Service方法
UserService service = new UserServiceImpl();
flag = service.active(code);
if (flag) {
//激活成功
}
}
if (!flag) {
//激活失败
}
进行流程控制,根据service方法的返回值跳转到不同的页面和给出不同的结果.
- UserService
@Override
public boolean active(String code) {
//根据集合面查询用户对象
User user = dao.findByCode(code);
if (user != null) {
//判断是否已经激活
if ("Y".equals(user.getStatus())) {
return true;
}
//调用dao修改激活状态的方法
user.setStatus("Y");
dao.updateStatus(user);
return true;
}
return false;
}
进行验证激活码的正确性,如果不存在该激活码则返回false,如果已经激活则不再进行激活操作.
- UserDao
/**
* 根据激活码查询用户信息
*
* @param code 激活码
* @return 信息
*/
@Override
public User findByCode(String code) {
String sql = "select * from tab_user where code=?";
User user = null;
try {
user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), code);
} catch (DataAccessException e) {
// e.printStackTrace();
}
return user;
}
/**
* 修改指定用户激活状态
*
* @param user 用户信息
*/
@Override
public void updateStatus(User user) {
String sql = "update tab_user set status= ? where uid=?";
template.update(sql, user.getStatus(), user.getUid());
}
}
- 使用之前保存的激活码作为识别,查询数据库中是否存在,存在就进行激活操作.
实际上可以使用redis进行存储验证码,可以较为简单保证验证链接的定时失效