黑马旅游网编写练习(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表达匹配_python 中文正则表达匹配
  2. Python入门篇-匿名函数
  3. Clusterware 和 RAC 中的域名解析的配置校验和检查 (文档 ID 1945838.1)
  4. 大型局域网二层三层结构比较
  5. python三层装饰器-python三大神器===》装饰器
  6. 做了一个网页,顺便录制了一个视频,大家看看高端不
  7. java mapreduce 标准差_MapReduce设计模式之概要设计模式
  8. aspose word 获取标题_Word干货|多级标题的自动编号怎么添加?
  9. vue res返回html,vue 组件内获取actions的response方式
  10. 安川机器人焊枪切换设定方法_【分享】焊接机器人的性能要求与系统构成
  11. 【百度地图API】如何制作孪生姐妹地图?
  12. java applet 按钮_Java Applet语法简介
  13. 怎样计算两个文本的Rougel,Bleu评价指标
  14. 如何设置使谷歌浏览器打开链接自动跳转到新标签页而不是覆盖当前页面?
  15. python 抠图源码_比PS还好用!Python 20行代码批量抠图
  16. 如何取得UnityHub内旧版本Unity下载链接
  17. python中怎样划分时间段_早中晚时间段是怎样划分的?
  18. project2010根据法定节假日更改工作时间
  19. 解决屏蔽流氓蜘蛛抓取,如MJ12bot 、DotBot 、BLEXBot 、PetalBot 、DataForSeoBot
  20. Cython-bbox pip 安装报错

热门文章

  1. 控制工程基础 董景新_全市第一!镇江新区新建成6家省级研发机构
  2. QT_BEGIN_NAMESPACE
  3. ION基本概念介绍和原理分析[转]
  4. Android开发java开发之常用英文词汇汇总。程序员必备英语单词
  5. python对肌电信号进行简单的手势识别
  6. 微信H5资源预加载(图片、字体)
  7. 抖音计算机音乐谱小苹果,抖音最火歌曲简谱 电子琴
  8. 精美古韵水墨中国风PPT模板
  9. 为什么你该开始学习编程了?
  10. 华为 1+X《网络系统建设与运维(中级)》认证实验模拟上机试题