1.Java实现用户注册,邮箱验证码激活的核心代码:

1.1 在RegisterServlet 用户注册类中

public class RegisterServlet extends HttpServlet {private static final long serialVersionUID = 1L;@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String userName=request.getParameter("username");String password=request.getParameter("password");String email=request.getParameter("email");System.out.println(userName+" "+password+" "+email);UserService userService=new UserServiceImpl();if(userService.doRegister(userName,password,email)){request.setAttribute("msg", "注册成功,请登录邮箱激活账号");}else{request.setAttribute("msg", "注册失败,请检查相关信息");}request.getRequestDispatcher("/result.jsp").forward(request, response);}
}

1.2 在ActiveServlet 邮箱验证中:

public class ActiveServlet extends HttpServlet {private static final long serialVersionUID = 1L;@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String code=request.getParameter("code");UserService userService=new UserServiceImpl();if(userService.activeUser(code)){request.getRequestDispatcher("/welcome.jsp").forward(request, response);}else{request.getRequestDispatcher("/fail.jsp").forward(request, response);}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

1.3 在UserService中

public interface UserService {boolean doRegister(String userName, String password, String email);boolean activeUser(String code);
}

1.4 在UserServiceImpl中

public class UserServiceImpl implements UserService {public boolean doRegister(String userName, String password, String email) {// 这里可以验证各字段是否为空//利用正则表达式(可改进)验证邮箱是否符合邮箱的格式if(!email.matches("^\\w+@(\\w+\\.)+\\w+$")){return false;}//生成激活码String code=CodeUtil.generateUniqueCode();User user=new User(userName,email,password,0,code);//将用户保存到数据库UserDao userDao=new UserDaoImpl();//保存成功则通过线程的方式给用户发送一封邮件if(userDao.save(user)>0){new Thread(new MailUtil(email, code)).start();;return true;}return false;}public boolean activeUser(String code) {UserDao userDao=new UserDaoImpl();if(userDao.activeUser(code)>0){return true;}else{return false;}}
}

1.5 在UserDao中

public interface UserDao {int save(User user);int activeUser(String code);
}

1.6 在UserDaoImpl中

public class UserDaoImpl implements UserDao{public int save(User user) {int num=0;try {Connection conn=DBUtil.getConnection();String sql ="insert into user(username,email,password,state,code) values(?,?,?,?,?)";PreparedStatement pstmt=conn.prepareStatement(sql);pstmt.setString(1, user.getUserName());pstmt.setString(2, user.getEmail());pstmt.setString(3, user.getPassword());pstmt.setInt(4, user.getState());pstmt.setString(5, user.getCode());num=pstmt.executeUpdate();DBUtil.close(conn,pstmt, null);} catch (SQLException e) {e.printStackTrace();}return num;}public int activeUser(String code) {int num=0;try {Connection conn=DBUtil.getConnection();String sql="update user set state=1 where code=?";PreparedStatement pstmt=conn.prepareStatement(sql);pstmt.setString(1, code);num=pstmt.executeUpdate();DBUtil.close(conn,pstmt,null);} catch (SQLException e) {e.printStackTrace();}return num;}
}

1.7 在CodeUtil中

public class CodeUtil {//生成唯一的激活码public static String generateUniqueCode(){return UUID.randomUUID().toString().replaceAll("-", "");}
}

1.8 在 MailUtils中

public class MailUtil implements Runnable {private String email;// 收件人邮箱private String code;// 激活码public MailUtil(String email, String code) {this.email = email;this.code = code;}public void run() {// 1.创建连接对象javax.mail.Session// 2.创建邮件对象 javax.mail.Message// 3.发送一封激活邮件String from = "xxx@qq.com";// 发件人电子邮箱String host = "smtp.qq.com"; // 指定发送邮件的主机smtp.qq.com(QQ)|smtp.163.com(网易)Properties properties = System.getProperties();// 获取系统属性properties.setProperty("mail.smtp.host", host);// 设置邮件服务器properties.setProperty("mail.smtp.auth", "true");// 打开认证try {//QQ邮箱需要下面这段代码,163邮箱不需要MailSSLSocketFactory sf = new MailSSLSocketFactory();sf.setTrustAllHosts(true);properties.put("mail.smtp.ssl.enable", "true");properties.put("mail.smtp.ssl.socketFactory", sf);// 1.获取默认session对象Session session = Session.getDefaultInstance(properties, new Authenticator() {public PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication("xxx@qq.com", "xxx"); // 发件人邮箱账号、授权码}});// 2.创建邮件对象Message message = new MimeMessage(session);// 2.1设置发件人message.setFrom(new InternetAddress(from));// 2.2设置接收人message.addRecipient(Message.RecipientType.TO, new InternetAddress(email));// 2.3设置邮件主题message.setSubject("账号激活");// 2.4设置邮件内容String content = "<html><head></head><body><h1>这是一封激活邮件,激活请点击以下链接</h1><h3><a href='http://localhost:8080/RegisterDemo/ActiveServlet?code="+ code + "'>http://localhost:8080/RegisterDemo/ActiveServlet?code=" + code+ "</href></h3></body></html>";message.setContent(content, "text/html;charset=UTF-8");// 3.发送邮件Transport.send(message);System.out.println("邮件成功发送!");} catch (Exception e) {e.printStackTrace();}}
}

1.9 在DBUtil中

public class DBUtil {private static ComboPooledDataSource cpds=null;static{cpds=new ComboPooledDataSource("mysql");}public static Connection getConnection(){Connection connection=null;try {connection = cpds.getConnection();} catch (SQLException e) {e.printStackTrace();}return connection;}public static void close(Connection conn,PreparedStatement pstmt,ResultSet rs){try {if(rs!=null){rs.close();}if(pstmt!=null){pstmt.close();}if(rs!=null){rs.close();}} catch (SQLException e) {e.printStackTrace();}}
}

1.10 所用到数据库表

create table `user`(id int(11) primary key auto_increment comment '用户id',username varchar(255) not null comment '用户名',email varchar(255) not null comment '用户邮箱',password varchar(255) not null comment '用户密码',state int(1) not null default 0 comment '用户激活状态:0表示未激活,1表示激活',code varchar(255) not null comment '激活码'
)engine=InnoDB default charset=utf8;

PS:若想通过代码更好的理解Java发送邮件,请:https://github.com/luomingkui/RegisterDemo

2.Java实现用户登录邮箱验证项目的核心代码:

2.1 点击获取验证码,调用如下:

在AdminUserController中

//获取验证码
@RequestMapping(value = "getVcode")
@ResponseBody
public Map<String, Object> getVcode(HttpServletRequest request) {String userName = request.getParameter("userName");Map<String , Object> map =new HashMap<String , Object>(4);String msg;try {String send=adminUserService.genSendVecode(userName);map.put("status", Constant.SUCCESS);map.put("msg", send);return map;} catch (Exception e) {if (e instanceof WlbException) {msg = e.getMessage();} else {msg = "管理系统异常,请稍候重试";}WlbManageLogger.e(">>>>>> loginIn action时异常,具体原因:%s", e.getLocalizedMessage()); e.printStackTrace();}map.put("status", Constant.ERROR);map.put("msg", msg);return map;
}

2.2 在AdminUserService中:

@Service
public class AdminUserService {@Autowiredprivate AdminUserDao adminUserDao;@Autowiredprivate AdminAuthDao adminAuthDao;private static String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生的字符串private static long expireTime = 24 * 60 * 60 * 1000;public static String generateVcode(String cellphone) {StringBuilder tmp = new StringBuilder();Random rand = new Random();for (int i = 0; i < 6; i++) {tmp.append(getRandomString(rand.nextInt(36)));}return tmp.toString();}public static String getRandomString(int num){return String.valueOf(randString.charAt(num));}/*** 邮箱发送验证码* @param userEmail* @return*/public String genSendVecode(String userEmail) {// 1. 校验邮箱是否正确// 2. 校验邮箱是否合法// 3. 生成验证码// 4. 将验证码发送至指定邮箱if (!RegexUtil.emailVerify(userEmail) || !userEmail.endsWith("@wolaibao.com") || !userEmail.endsWith("@zhongbao.email") ) {throw new WlbException("用户账户错误,请重新输入");}AdminUser adminUser = findAdminByAccount(userEmail);if (null == adminUser || StringUtils.isBlank(adminUser.getUsername())|| adminUser.getStatus()!=0) {throw new WlbException("用户账户错误,请重新输入");}AdminAuth lastAuth = adminAuthDao.selectLastVcode(userEmail);if (lastAuth != null && System.currentTimeMillis() - lastAuth.getUpdateTime().getTime() < (1 * 60 * 1000)) {throw new WlbException("验证码已经发送至邮箱请勿重复获取");}String vcode;if (lastAuth == null || System.currentTimeMillis() - lastAuth.getExpireTime() > 0) {vcode = generateVcode(userEmail);AdminAuth adminAuth = new AdminAuth();adminAuth.setEmail(userEmail);adminAuth.setVcode(vcode);adminAuth.setExpireTime(System.currentTimeMillis() + expireTime);adminAuthDao.insert(adminAuth);} else {vcode = lastAuth.getVcode();adminAuthDao.update(lastAuth);}MsgService.sendMail(userEmail, "管理后台登录验证", "管理后台登录验证码为:" + vcode + "\n有效期为24小时!");return "我有效期为24来保管理后台登录验证已经发送至邮箱,小时,请注意保管验证码";}private AdminUser findAdminByAccount(String userEmail) {return adminUserDao.selectByAccount(userEmail);}
}

2.3 在 MsgService 发送邮件接口中:

@Service
public class MsgService {
/*** 调用邮件发送接口* @param to* @param subject* @param content*/public static void sendMail(String to, String subject, String content) {try {NetRequest mailRequest = new NetRequest(ClientApiMethod.MSG_EMAIL).setMethod(RequestMethod.GET);Map<String, Object> params = new HashMap<>();params.put("to", to);params.put("content", content);params.put("subject", subject);mailRequest.setParams(params);String msgRsp = new HttpExecutor().execute(mailRequest, String.class);Loggers.MANAGE.debug("REQUEST email : ", to, "\nRESPONSE", msgRsp.trim());} catch (Exception e) {Loggers.MANAGE.error("SendMsg error: \n", e);}}
}

2.4 在NetRequest中

public class NetRequest {/*** 请求方法*/private RequestMethod method = RequestMethod.GET;/*** 请求url*/private String path;/*** 标示*/private String tag;public NetRequest(String url) {this.path = url;this.tag = "request-" + hashCode();}public RequestMethod getMethod() {return method;}public NetRequest setMethod(RequestMethod method) {this.method = method;return this;}public String getUrl() {return path;}public NetRequest setUrl(String path) {this.path = path;return this;}public String getTag() {return tag;}public NetRequest setTag(String tag) {this.tag = tag;return this;}}

2.5 在ClientApiMethod中

public class ClientApiMethod {
private static final String MSG_HOST = Config.getInstance().getHttpMsgHost();public static final String MSG_EMAIL = MSG_HOST + "/msg/email.json";public static final String MSG_EMAIL_HTML = MSG_HOST + "/msg/emailHtml.json";public static final String APL_NOTIFY = "/taskDistribution/taskDistributionManager.json";
}

2.6 在HttpExecutor中

public class HttpExecutor {public List<HttpTask> taskList = new ArrayList<HttpTask>();/*** 同步执行请求* @param netRequest 请求* @param cls  接口响应结果Class* @param <T>* @return*/public <T> T execute(NetRequest netRequest,Class<T> cls) {HttpTask httpTask = new HttpTask().setHttpParam(netRequest);taskList.add(httpTask);String responseData= httpTask.start();if(StrUtil.isBlank(responseData))return null;T response =null;try {response = netRequest.getDataParser().parseResponse(responseData, cls);} catch (Exception e) {e.printStackTrace();}return response;}
}

Java 实现邮箱验证相关推荐

  1. 【实战】Java实现邮箱验证

    Java实现邮箱验证 一.JavaMail 1.什么是JavaMail? JavaMail,提供给开发者处理电子邮件相关的编程接口,它是sun发布的用来处理email的API,它可以方便地执行一些常用 ...

  2. spring java 发送邮箱验证

    使用spring API实现发送邮箱验证的功能 pom.xml文件 <dependency><groupId>org.springframework.integration&l ...

  3. Java实现邮箱验证

    1.我们首先要实现一个简单的注册功能,然后再实现邮箱验证功能: 2.邮箱验证功能实现:整个功能的核心是创建一个邮件工具类,这需要导入mail.jar.具体代码如下: package com.imooc ...

  4. java实现邮箱验证QQ邮箱验证和Foxmail验证

    这两天公司要求做个Android端邮箱认证,android端还是很简单的,主要难点在后台链接邮箱并发送邮件. 思路:android端传送邮箱地址给后台,后台获取邮箱地址后,链接公司邮箱,并发送验证码邮 ...

  5. 慕课网_《Java实现邮箱验证》学习总结

    时间:2017年06月07日星期三 说明:本文部分内容均来自慕课网.@慕课网:http://www.imooc.com 教学示例源码:无 个人学习源码:https://github.com/zccod ...

  6. Java实现邮箱验证功能

    (p.s.减少出现554垃圾邮件 1.先给自己抄送一份: message.addRecipient(Message.RecipientType.CC, new InternetAddress(from ...

  7. java实现邮箱注册验证

    java实现邮箱验证的功能 在日常生活中,我们在一个网站中注册一个账户时,往往在提交个人信息后,网站还要我们通过手机或邮件来验证,邮件的话大概会是下面这个样子的: 用户通过点击链接从而完成注册,然后才 ...

  8. java 邮箱验证_Java实现邮箱验证

    Java实现邮箱验证 JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输.我们可以基于JavaMail开 ...

  9. java编写邮箱地址、邮箱验证

    一.java编写邮箱地址.邮箱验证 例如: 编写一个邮箱地址是否合法,如果合法则打印出用户名部分和该邮箱所属的网站域名,如果邮箱地址不合法则显示不合法的原因 温馨提示:邮箱地址不合法的因素: (1)邮 ...

  10. Java邮箱验证错误收集

    Java邮箱验证异常收集 一.身份验证失败异常: 535 Error:ÇëʹÓÃÊÚȨÂëµÇ¼¡£ÏêÇéÇë¿´http://service.mail.qq.com/cgi-bin/help ...

最新文章

  1. OpenCV 【四】————Watershed Algorithm(图像分割)——分水岭算法的原理及实现
  2. SQL中的case when then else end用法
  3. Mysql 安全登陆工具 mysql_config_editor
  4. Java Socket通信编程
  5. 万字长文让你看够幂级数
  6. android 输入光标修改颜色_2.2 输入数值与文本
  7. 什么是nginx负载均衡高可用
  8. HTML5新增属性学习笔记
  9. 无法打开物理文件 XXX.mdf,操作系统错误 5.5(拒绝访问) 的解决办法
  10. JSON中的多行字符串
  11. C# File流操作
  12. 自主访问控制 强制访问控制_快速访问控制
  13. 电影特效合成软件:The Foundry Nuke 11 for Mac
  14. 成手指状态html,css手势状态定义属性cursor和自定义鼠标手势详解
  15. 用g++编译cpp文件
  16. Ubuntu18.04 显卡驱动安装(GTX1060)正确步骤
  17. iOS清理缓存的简单实现
  18. python三阶魔方_三阶魔方还原公式
  19. Mapped Statements collection does not contain value for 解决方法之一
  20. VMware VCP-DCV认证课程概述

热门文章

  1. 在Windows上安装FFmpeg程序
  2. SPSS Clementine 安装教程
  3. 几款主流电子电路仿真软件优缺点比较
  4. cad导出pdf_CAD手机看图软件中怎么将CAD图纸转为PDF/图片格式?
  5. 基于bootstrap 的AceAdmin 1.4版本(iframe修改)
  6. Java 程序员必须掌握的 4 大开源框架!
  7. java数据结构银行叫号_数据结构C语言版利用队列结构实现银行叫号系统要..._结构工程师_帮考网...
  8. 阵列信号处理及matlab实现_球形麦克风阵列设计
  9. Synopsys VCS vY-2006.06
  10. PLSQL修改表字段长度报ORA-25150错