----------------------------------------------------------------------------------------------
[版权申明:本文系作者原创,转载请注明出处] 
文章出处: http://blog.csdn.net/sdksdk0/article/details/52144698
作者:朱培      ID:sdksdk0      邮箱: zhupei@tianfang1314.cn

--------------------------------------------------------------------------------------------

本文主要内容是分享用户注册时需要进行的邮箱激活功能的实现。在我们都知道在一个网站中,用户注册后需要来一个邮箱进行激活是很常见的功能,那么我们今天就来学习一下这个邮箱验证功能.这里以我的一个小项目“网上书店”的这个模块来说明这个邮箱激活的功能!采用的是mvc模式开发!

一、数据库设计

首先我们需要对用户注册的表进行设计,里面要添加激活码的字段和激活的状态的字段。我们可以看到页面是这样的,有5个需要填写的字段,然后加上我们这个激活码的就有7个了。

这里我采用的是mysql数据库。actived表示激活码的状态位,0表示未激活,1表示激活了.

CREATE TABLE customers(id VARCHAR(100)  PRIMARY KEY,username VARCHAR(100) NOT NULL UNIQUE,PASSWORD VARCHAR(100) NOT NULL,phone VARCHAR(20) NOT NULL UNIQUE,address VARCHAR(255) NOT NULL ,email VARCHAR(50) NOT NULL UNIQUE,CODE VARCHAR(200) UNIQUE,   --激活码actived BIT(1)     --激活码的状态位,0表示未激活,1表示激活
)

二、bean设计

新建一个Customer.java

生成其get\set方法即可。

private String id;private String username;private String password;private String phone;private String address;private String email;private String code;  //激活码private boolean actived;  //账户是否激活

三、接口设计

新建一个CustomerDao.java

有保存密码、更新激活状态、登录等。

public interface CustomerDao {void save(Customer customer);void update(Customer customer);Customer findByCode(String code);Customer find(String username, String password);}

接口的实现类

CustomerDaoImpl.java

我们主要就是在这个里面进行与数据库的交互

public class CustomerDaoImpl implements CustomerDao {private QueryRunner  qr=new QueryRunner(C3P0Util.getDataSource());public void save(Customer customer) {try {qr.update("insert into customers (id,username,password,phone,address,email,code,actived) values (?,?,?,?,?,?,?,?)", customer.getId(),customer.getUsername(),customer.getPassword(),customer.getPhone(),customer.getAddress(),customer.getEmail(),customer.getCode(),customer.isActived());} catch (SQLException e) {throw new RuntimeException(e);}}public void update(Customer customer) {try {qr.update("update customers set username=?,password=?,phone=?,address=?,email=?,code=?,actived=? where id=?", customer.getUsername(),customer.getPassword(),customer.getPhone(),customer.getAddress(),customer.getEmail(),customer.getCode(),customer.isActived(),customer.getId());} catch (SQLException e) {throw new RuntimeException(e);}}public Customer findByCode(String code) {try {return qr.query("select * from customers where code=?", new BeanHandler<Customer>(Customer.class),code);} catch (SQLException e) {throw new RuntimeException(e);}}public Customer find(String username, String password) {try {return qr.query("select * from customers where username=? and password=?", new BeanHandler<Customer>(Customer.class),username,password);} catch (SQLException e) {throw new RuntimeException(e);}}
}

四、Service的实现

新建一个service类:接口BusinessService.java

//用户注册void registCustomer(Customer customer);//根据激活码获取用户信息Customer findByCode(String code);//激活客户的账户void activeCustomer(Customer customer);//根据用户名或密码登录,如果账户没有激活就返回nullCustomer login(String username,String password);

接口的实现

@Overridepublic void registCustomer(Customer customer) {customer.setId(UUID.randomUUID().toString());customerDao.save(customer);}@Overridepublic Customer findByCode(String code) {return customerDao.findByCode(code);}@Overridepublic void activeCustomer(Customer customer) {if(customer==null)throw new RuntimeException("数据不能为空");if(customer.getId()==null)throw new RuntimeException("更新数据的主键不能为空");customerDao.update(customer);}@Overridepublic Customer login(String username, String password) {Customer customer = customerDao.find(username,password);if(customer==null)return null;if(!customer.isActived())return null;return customer;}

五、Servlet的实现

这里是控制层:激活邮箱我使用的是在另外的一个线程中实现的。SendMailThread.java中实现。

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String op=request.getParameter("op");if("customerRegist".equals(op)){customerRegist(request,response);}else if("activeCustomer".equals(op)){activeCustomer(request,response);}else if("login".equals(op)){login(request,response);}else if("logout".equals(op)){logout(request,response);}}//注销登录private void logout(HttpServletRequest request, HttpServletResponse response) throws IOException {request.getSession().removeAttribute("customer");response.getWriter().write("注销成功!2秒后转向主页");response.setHeader("Refresh", "2;URL="+request.getContextPath());}//用户登录private void login(HttpServletRequest request, HttpServletResponse response) throws IOException {String username=request.getParameter("username");String password=request.getParameter("password");Customer customer=s.login(username, password);if(customer==null){response.getWriter().write("错误的用户名或密码,或者您的账户还没有激活!5秒后转向登陆页");response.setHeader("Refresh", "5;URL="+request.getContextPath()+"/login.jsp");return;}request.getSession().setAttribute("customer", customer);response.getWriter().write("登陆成功!2秒后转向主页");response.setHeader("Refresh", "2;URL="+request.getContextPath());}//激活邮箱private void activeCustomer(HttpServletRequest request,HttpServletResponse response) throws IOException {String code=request.getParameter("code");Customer customer=s.findByCode(code);if(customer==null){response.getWriter().write("发生未知错误,请重新输入");return ;}customer.setActived(true);s.activeCustomer(customer);response.getWriter().write("激活成功!2秒后转向主页");response.setHeader("Refresh", "2;URL="+request.getContextPath());}//新用户注册,发送激活邮件private void customerRegist(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {//封装数据Customer customer=WebUtil.fillBean(request,Customer.class);customer.setCode(UUID.randomUUID().toString());//发送邮件,单独启动一个线程SendMailThread smt=new SendMailThread(customer);smt.start();s.registCustomer(customer);request.setAttribute("message", "注册成功,我们已经发送了一封激活邮件到您的"+customer.getEmail()+"中,请及时激活您的账户");request.getRequestDispatcher("/message.jsp").forward(request, response);}

六、邮件的发送

我们刚才将其抽取到一个线程中来实现.我这里使用的是万网的mail.host,所以其属性值为smtp.mxhichina.com,如果你用的是163邮箱的话,就替换为smtp.163.com即可。

对于下面点击激活后跳转的网址为你的工程的名字,这个可以根据实际情况配置,也可以直接引入公网域名来使用。

<a href='http://localhost:8080/BookStore/servlet/ClientServlet?op=activeCustomer&code="+customer.getCode()+"'>激活</a>

public class SendMailThread extends Thread{private Customer customer;public SendMailThread(Customer customer){this.customer=customer;}public void run(){Properties props=new Properties();props.setProperty("mail.transport.protocol", "smtp");//规范规定的参数props.setProperty("mail.host", "smtp.mxhichina.com");//这里使用万网的邮箱主机props.setProperty("mail.smtp.auth", "true");//请求认证,不认证有可能发不出去邮件。Session session=Session.getInstance(props);MimeMessage message=new MimeMessage(session);try {message.setFrom(new InternetAddress("xingtian@tianfang1314.cn"));  //这里可以根据你的实际情况更改邮箱号
message.setRecipients(Message.RecipientType.TO, customer.getEmail());message.setSubject("来自指令汇科技书店的注册邮件");message.setContent("","text/html;charset=UTF-8");message.setContent("亲爱的"+customer.getUsername()+":<br/>请猛戳下面激活您的账户<a href='http://localhost:8080/BookStore/servlet/ClientServlet?op=activeCustomer&code="+customer.getCode()+"'>激活</a><br/>", "text/html;charset=UTF-8");message.saveChanges();Transport ts = session.getTransport();ts.connect("你的邮箱账号", "邮箱密码");ts.sendMessage(message, message.getAllRecipients());ts.close();} catch (AddressException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoSuchProviderException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (MessagingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

七、界面

关于注册的这个界面我是真的不写了,其实就是一个表单而已,里面通过一个servlet转向那个servlet就可以了。记得去web.xml中配置一个servlet,或者你直接用注解也是可以的。

 <form action="${pageContext.request.contextPath}/servlet/ClientServlet?op=customerRegist" method="post">

效果如下:

源码地址:https://github.com/sdksdk0/BookStore

用户注册的邮箱激活模块的设计与实现相关推荐

  1. thinkphp实现用户注册时邮箱激活

    有些网站在注册的时候,会向用户的邮箱发送邮件,点击邮件中的链接激活账户,基本原理就是在注册的时候(即点击发送邮件的时候),先把用户的信息存进数据库,另外还有一个激活状态的字段(默认是未激活)点击邮件中 ...

  2. java web 邮箱激活 与 忘记密码(重置密码)

    推荐: java后台通用权限管理系统(springboot)(https://blog.csdn.net/zwx19921215/article/details/97806078) 推荐:java 个 ...

  3. Java案例-用户注册邮箱验证将邮箱激活码存入redis功能实现

    <–start–> 用户注册时,要求用户填写注册邮箱,然后后台向用户的注册邮箱中发送绑定邮件,并将激活码保存到redis中. 手机短信验证码因为时效期短,只需要将短信验证码存储到sessi ...

  4. java用户注册邮箱激活

    电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等.但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送.本 ...

  5. JAVA高级应用课程设计(网上书城系统——会员登陆模块的设计与实现)

    课程设计报告 课   程  名   称: JAVA高级应用课程设计 设   计  题   目:网上书城系统--会员登陆模块的设计与实现 目 录 一.开发背景. 1 (一)背景概述. 1 (二)发展前景 ...

  6. lin-cms-dotnetcore功能模块的设计

    先来回答以下问题. 1.什么是cms? Content Management System,内容管理系统. 2.dotnetcore是什么? .NET Core,是由Microsoft开发,目前在.N ...

  7. SSM框架解决QQ邮箱激活535 Error: ÇëʹÓÃÊÚȨÂëµÇ¼¡£ÏêÇéÇë¿´及端口25被占用问题

    SSM解决阿里云服务器邮箱激活25端口被占用,通过JAVA代码调用端口465及535 SSM框架实现商城邮箱激活账号出现535问题 阿里云服务器25端口关闭问题 控制器EmailCtrl代码: 接下来 ...

  8. java案例----用户注册--发送邮件并激活/发送邮件验证码

    java案例----用户注册-发送邮件并激活/发送邮件验证码 一.前期准备 1.准备两个邮箱账号(一个发邮件,一个收邮件) 1.1)登录需要发送邮件的QQ邮箱,找到设置项 1.2)然后在账户栏下,找到 ...

  9. 阐述一下ecshop各模块的功能_【光电通信】40G QSFP+ LR4 光模块的设计与实现(一)...

    今日光电        有人说,20世纪是电的世纪,21世纪是光的世纪:知光解电,再小的个体都可以被赋能.欢迎来到今日光电! ----与智者为伍 为创新赋能---- 1.绪论 高清视频.云存储和云计算 ...

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

    黑马旅游网编写练习(2)–邮箱激活功能 当用户进行注册时,一般会需要使用邮箱进行激活:所以在这里也模拟一下注册后邮箱的激活功能. 首先导入发送邮箱的jar包mail.jar:或者配置maven地址为: ...

最新文章

  1. SQL 2005 中的数据约束
  2. 圈子 | 大数据分析汽车O2O的机会
  3. memcache和memcached的区别
  4. Gym-100676E Time Limit Exceeded?
  5. 7-8 最优服务次序问题 (10 分)
  6. 【渝粤教育】广东开放大学 Linux操作系统 形成性考核 (55)
  7. redis和php有什么,redis主要用来做什么
  8. mac mysql降版本_Mac卸載mysql並安裝mysql升級到8.0.13版本
  9. 下载python教程-python教程pdf下载
  10. 使用AXI Verifcation IP进行系统验证
  11. 分布式数据库系统体系结构
  12. PEST、波特五力、波士顿矩阵、SWOT、价值链等战略分析方法整理学习笔记
  13. spring学习-01编译spring5.0源码(亲测可用)
  14. POI操作Microsoft Office 之 操作PPT简单示例(附源码)
  15. 人机交互课后习题——感知和认知基础
  16. 迅雷虚拟服务器,迅雷离线服务器UA
  17. 什么样的Python培训机构才是好机构?
  18. LaTeX模板——英文写作
  19. python 画等边三角形
  20. 印象笔记 Markdown使用指南

热门文章

  1. 手机浏览器打开微信小程序,支持外部浏览器跳转到小程序
  2. mac显示所有文件后缀名
  3. java 412_http 412问题
  4. 线性方程组的几种解法以及解的性质和结构
  5. 方向导数,偏导数,梯度
  6. 足球足球裁判昏招大全裁判昏招大全
  7. 二頌(金火互易過程)
  8. Python3,9行代码进行压缩和解压缩,从此告别压缩软件。
  9. 不要老是盯着你的对手,要开始盯紧你的用户啦
  10. linux里case命令,Linux系统中的case命令怎么用