黑马旅游网编写练习(2)–邮箱激活功能

当用户进行注册时,一般会需要使用邮箱进行激活;所以在这里也模拟一下注册后邮箱的激活功能。

首先导入发送邮箱的jar包mail.jar;或者配置maven地址为:

    <!--javaMail--><dependency><groupId>javax.mail</groupId><artifactId>javax.mail-api</artifactId><version>1.5.6</version></dependency><dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.5.3</version></dependency>

然后编写Java发送邮箱的代码,如下:

    /*** 发邮件工具类*/public final class MailUtils {private static final String USER = "1330495503@qq.com"; // 发件人称号,同邮箱地址private static final String PASSWORD = "xxxxxxxxxxxx"; // 如果是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() {@Overrideprotected 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 { // 做测试用try {MailUtils.sendMail("shengguilv@163.com","你好,这是一封测试邮件,无需回复。","测试邮件");} catch (Exception e) {//e.printStackTrace();  //发送失败System.out.println("邮件发送失败");}System.out.println("发送成功");}}

注意:使用上述工具进行发送时,需要首先开启相应的pop3服务,然后使用授权码作为发送邮件人的密码使用,以防止泄露密码
在这里我使用的是qq邮箱给163邮箱发送邮件;所以我需要开启QQ邮箱的pop3服务;然后我收到一个授权码,替换上述PASSWORD = "xxxxxxxxxxxx"中的xxxxxxxxxxxx即可。

邮件发送功能测试完成后,接下来开始编写用户注册后的邮箱激活功能

在开始编写之前,还需要对之前的service层的regist方法进行修改,在此处为用户添加激活状态为N,并添加激活码(唯一标识)。然后还需要修改dao层的regist方法,将这两个新加的变量也写到数据库中。
service层的regist方法修改如下:

    /*** 注册用户,注册成功返回true* @param user* @return*/@Overridepublic Boolean regist(User user) {// 先设置用户的激活状态为N,并添加激活码,唯一标识user.setStatus("N");user.setCode(UuidUtil.getUuid());System.out.println("Code:"+user.getCode());// 调用dao层查询数据库User u = dao.regist(user);if(u != null){// 注册成功// 给注册用户发送邮件提醒激活,当用户点击激活时,会访问activeUserServlet,并提交该用户的激活码String msg = "<div>欢迎注册黑马旅游网,请点击此处进行<a href='http://localhost/travel/activeUserServlet?code="+u.getCode()+"'>激活</a><br/><br/>本邮件由系统自动发出,请勿回复。<br/>感谢您的使用。</div>";MailUtils.sendMail(u.getEmail(),msg,"激活邮件");return true;}else {//注册失败return false;}}

dao层的regist方法修改如下:

    /*** 注册用户,返回user* @param user* @return*/@Overridepublic User regist(User user) {// 编写sqlString sql = "insert into tab_user(username,password,name,birthday,sex,telephone,email,status,code) values(?,?,?,?,?,?,?,?,?)";// 执行sqltry {template.update(sql,user.getUsername(),user.getPassword(),user.getName(),user.getBirthday(),user.getSex(),user.getTelephone(),user.getEmail(),user.getStatus(),user.getCode());} catch (DataAccessException e) {//e.printStackTrace();  注册失败System.out.println("dao----Registered Faild!");return null;}return user;}

接下来开始编写邮箱激活的activeUserServlet,我们已经设置了用户点击激活时,会访问此资源,并且提交该用户的唯一标识。所以我们需要通过该唯一标识,查找到该用户,然后设置该用户的激活状态为Y。激活后会跳转到一个单独的界面,上面会给出激活成功与否的提示,若激活成功,则给出一个登录的超链接,点击登录后跳转到登陆界面login.html
activeUserServlet的主要代码如下:

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//接收用户的激活码String code = request.getParameter("code");System.out.println("code:"+code);if(code == null || code.length() <= 0){// 激活码不存在return;}//调用service层方法,完成邮箱的激活UserService service = new UserServiceImpl();Boolean activated = service.active(code);String msg = null;if(activated){// 激活成功System.out.println("Active succeed!");msg = "激活成功,请<a href='login.html'>登录</a>";}else{//激活失败System.out.println("Active failed!");msg = "激活失败,请重新激活";}//将消息发送给客户端response.setContentType("text/html;charset=utf-8");response.getWriter().write(msg);}

需要在service层添加一个active方法,用来激活用户;主要代码如下:

    /*** 通过激活码给用户进行激活,激活成功返回true* @param code* @return*/@Overridepublic Boolean active(String code) {// 调用dao层通过激活码查询用户方法User user = dao.findUserByCode(code);// 判断用户是否存在if(user == null){// 用户不存在System.out.println("service:--the user isn`t exist!");return false;}// 调用dao层修改用户激活状态为Y的方法dao.updateUserStatus(user);return true;}

然后需要在dao层添加两个方法,一个用来根据激活码查询用户是否存在,称作findUserByCode方法;另一个用来修改用户的激活状态码为Y,称作updateUserStatus方法。两个方法的主要代码如下:

    /*** 通过激活码查询用户,,若存在,返回User* @param code* @return*/@Overridepublic User findUserByCode(String code) {// 定义sqlString sql = "select * from tab_user where code = ? ";try {// 执行sqlUser user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), code);return user;} catch (DataAccessException e) {//e.printStackTrace();  //查询出错System.out.println("NO user find, where code = " + code);return null;}}/*** 修改用户的激活状态为Y* @param user*/@Overridepublic void updateUserStatus(User user) {// 定义sqlString sql = "update tab_user set status = 'Y' where uid = ? ";try {// 执行sqltemplate.update(sql,user.getUid());} catch (DataAccessException e) {//e.printStackTrace();  //修改用户激活状态出错System.out.println("Error in updateUserStatus!");}}

据此,便可以实现新注册用户的邮箱验证功能了;接下来便开始编写用户的登录功能,只有注册成功并进行了邮件激活的用户才可以登录。

黑马旅游网编写练习(2)--邮箱激活功能相关推荐

  1. 黑马旅游网编写练习(4)--优化工程目录结构

    黑马旅游网编写练习(4)–优化工程目录结构 经过前面的三次练习,已经实现了用户的登录,账户激活,以及用户退出的相关功能:然而在实际项目过程中,这些当然只能算是基础功能:在此过程中,我们为每一个小功能都 ...

  2. 黑马旅游网编写练习(3)--登录和退出功能

    黑马旅游网编写练习(3)–登录和退出功能 完成用户的注册和邮箱激活功能之后,接下来进行登录功能的编写. 分析: 当用户在登陆界面输入用户名,密码以及验证码后,点击登录按钮:我们让其发送Ajax请求:s ...

  3. 黑马旅游网编写练习(1)--注册功能

    黑马旅游网编写练习 黑马旅游网是包含学习完java-web的一个综合项目:项目中既包含前端,也包含后端的逻辑处理.项目使用三级结构,并未使用框架技术. 本次项目使用maven管理.练习使用一些编写好的 ...

  4. 黑马旅游网编写练习(6)--旅游线路分页展示功能

    黑马旅游网编写练习(6)–旅游线路分页展示功能 首页的目录展示功能已经完成,在进入主页后,页面会自动向服务器发送Ajax请求,从而获取目录数据,我们将其名称cname展示到页面中:接下来要实现的是分页 ...

  5. 黑马旅游网编写练习(10)--用户收藏线路的展示功能

    黑马旅游网编写练习(10)–用户收藏线路的展示功能 分析 当用户点击我的收藏按钮时,需要将用户所收藏的所有线路进行展示:并且点击响应的线路,就会跳转到该线路对应的详情页面. 旅游线路的分页展示功能之前 ...

  6. 黑马旅游网编写练习(9)--旅游线路收藏功能

    黑马旅游网编写练习(9)–旅游线路收藏功能 旅游线路收藏功能分析 在旅游详情页面,用户点击收藏按钮后,我们向服务器发送Ajax请求:然后查询用户是否登录:若用户已登录,则需要查询数据库表格判断该用户是 ...

  7. 黑马旅游网编写练习(5)--目录的分类展示功能

    黑马旅游网编写练习(5)–目录的分类展示功能 我们已经把项目的结构进行了优化,接下来编写目录展示相关的功能,所以我们单独创建其文件,包含dao层,service层,以及web层,全部重新创建文件,封装 ...

  8. 黑马旅游网编写练习(7)--某一旅游线路详情展示

    黑马旅游网编写练习(7)–某一旅游线路详情展示 在分页展示的页面中,我们点击某一个旅游,想要查看详细信息,则点击了查看详情后,会跳转到该旅游路线对应的详细信息页面.接下来对该详细信息页面的查询与展示. ...

  9. JavaWeb黑马旅游网-学习笔记02【注册功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

最新文章

  1. python给列表中的字典按照字典中的某个键值进行排序
  2. SQL语言之DQL语言学习(十一)分页查询
  3. 达梦数据库导入oracle数据_达梦数据库和oracle数据的一些区别
  4. 095实战 ETL的数据来源,处理,保存
  5. 判断用户 小程序_解读微信小程序用户运营四部曲
  6. 英语本科 国外跨计算机,跨专业考研需具备哪些条件,如英语,计算机的过级情况...
  7. 28. 字符串的排列(C++版本)
  8. FL计算机软件,FL Studio水果编曲软件
  9. qqkey获取原理_HIT我守护的一切手游电脑版苹果版有吗 HIT我守护的一切iOS电脑版模拟器...
  10. Mac 平台下功能强大的Shimo软件使用指南
  11. 电脑待办事项桌面_电脑上有没有治拖延症的软件?怎么在办公电脑上添加一款提醒便签软件...
  12. 移动端开发rem实现屏幕适配及处理页面加载页面坍塌样式错乱网页闪烁问题
  13. Docker容器域名解析失败
  14. colab 跑 deformable-detr 记录:
  15. 20222808郭锦城 2022-2023-2 《网络攻防实践》第10次作业
  16. oracle的视图如何使用,Oracle 视图讲解及使用实例
  17. 【LeetCode】463. 岛屿的周长
  18. 基于QT的客户管理系统CRM
  19. 电脑以太网网络连接不稳定/重置电脑网络配置/电脑无法上网解决方法
  20. devexpress控件的2种汉化方法,官方想得很周到

热门文章

  1. html5视频播放器字幕,HTML5 带字幕播放器(类youtube字幕)
  2. IDEA的安装和破解;Maven介绍;Object类的学习
  3. IoC 和 AOP讲解
  4. 数据集(3):从0了解INRIA数据集
  5. sEMG项目总结(6)NinaPro肌电数据集(52类动作)
  6. android dumpsys 分析,Android内存分析工具-dumpsys meminfo
  7. 互联网大公司和小公司的区别
  8. 批量插入CAD块及标注(带程序运行计时功能)
  9. [人工智能]回溯算法解数独
  10. flutter插件进阶之手把手教你编写简易插件(五)