需求:网站注册用户时,需要填写邮箱,用户成功提交了信息后,会提示用户去邮箱激活帐号,激活后账号才能使用,否则不可以登录。
思路:
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("[email protected]"));//#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", "激活失败,重新激活"); } }