Java实现邮箱验证

xiaoxiao2021-02-28  69

一.创建数据库foxmail,再创建user表

CREATE DATABASE Foxmail;

USE Foxmail;

CREATE TABLE `user`( `uid` INT PRIMARY KEY AUTO_INCREMENT, `username` VARCHAR(20) DEFAULT NULL, `password` VARCHAR(20) DEFAULT NULL, `nickname` VARCHAR(20) DEFAULT NULL, `email` VARCHAR(30) DEFAULT NULL, `state` INT(11) DEFAULT NULL, `code` VARCHAR(64) DEFAULT NULL

)ENGINE=INNODB DEFAULT CHARSET=utf8;

 

二.配置环境,安装软件

 

eyoumailserversetup.exe  :易邮邮件服务器

Foxmail.exe  :Foxmail客户端

 

 1.创建邮箱账号

 

 

 

 

2.登录Foxmail客户端

 

 

三.使用eclipse编写代码

 1.新建一个web项目

 

 2.实体类domain

代码如下:----User.java

 

1 package com.xigua.domain; 2 3 public class User { 4 5 private Integer uid; 6 private String username; 7 private String password; 8 private String nickname; 9 private String email; 10 private Integer state; 11 private String code; 12 public Integer getUid() { 13 return uid; 14 } 15 public void setUid(Integer uid) { 16 this.uid = uid; 17 } 18 public String getUsername() { 19 return username; 20 } 21 public void setUsername(String username) { 22 this.username = username; 23 } 24 public String getPassword() { 25 return password; 26 } 27 public void setPassword(String password) { 28 this.password = password; 29 } 30 public String getNickname() { 31 return nickname; 32 } 33 public void setNickname(String nickname) { 34 this.nickname = nickname; 35 } 36 public String getEmail() { 37 return email; 38 } 39 public void setEmail(String email) { 40 this.email = email; 41 } 42 public Integer getState() { 43 return state; 44 } 45 public void setState(Integer state) { 46 this.state = state; 47 } 48 public String getCode() { 49 return code; 50 } 51 public void setCode(String code) { 52 this.code = code; 53 } 54 55 56 57 }

 

3.C3P0.config.xml代码

 

1 <?xml version="1.0" encoding="UTF-8"?> 2 3 4 <c3p0-config> 5 <default-config> 6 <property name="driverClass">com.mysql.jdbc.Driver</property> 7 <property name="jdbcUrl">jdbc:mysql://localhost:3306/foxmail</property> 8 <property name="user">root</property> 9 <property name="password">123</property> 10 11 <property name="acquireIncrement">5</property> 12 <property name="initialPoolSize">10</property> 13 <property name="minPoolSize">5</property> 14 <property name="maxPoolSize">20</property> 15 16 17 </default-config> 18 19 </c3p0-config>

 

 4.编写utils包内的工具类

 

 C3P0Util.java 代码如下:

1 package com.xigua.utils; 2 3 import javax.sql.DataSource; 4 5 import com.mchange.v2.c3p0.ComboPooledDataSource; 6 7 public class C3P0Util { 8 /** 9 * 配置文件的名字只能叫c3p0-config.xml ,位置只能放在src的根目录下�?? 10 * 默认是去找default-config的配�? 11 */ 12 private static ComboPooledDataSource dataSource=new ComboPooledDataSource(); 13 14 public static DataSource getDataSource(){ 15 return dataSource; 16 17 } 18 } 19 20

  JDBCUtils.java 代码如下:

1 package com.xigua.utils; 2 3 import java.beans.PropertyVetoException; 4 import java.sql.Connection; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 import java.sql.Statement; 9 10 import com.mchange.v2.c3p0.ComboPooledDataSource; 11 import com.mchange.v2.c3p0.DataSources; 12 13 public class JDBCUtils { 14 private static String url = "jdbc:mysql://localhost:3306/foxmail"; 15 private static String user = "root"; 16 private static String passwd = "123"; 17 private static String driver = "com.mysql.jdbc.Driver"; 18 19 public static ComboPooledDataSource getDataSource() throws Exception{ 20 ComboPooledDataSource cpds = new ComboPooledDataSource(); 21 cpds.setDriverClass( driver); 22 cpds.setJdbcUrl( url ); 23 cpds.setUser(user); 24 cpds.setPassword(passwd); 25 cpds.setMinPoolSize(5); 26 cpds.setAcquireIncrement(5); 27 cpds.setMaxPoolSize(30); 28 cpds.setMaxIdleTime(60); 29 return cpds; 30 } 31 }

MailUtils.java代码如下:

1 package com.xigua.utils; 2 3 import java.util.Properties; 4 5 import javax.mail.Authenticator; 6 import javax.mail.Message.RecipientType; 7 import javax.mail.MessagingException; 8 import javax.mail.PasswordAuthentication; 9 import javax.mail.Session; 10 import javax.mail.Transport; 11 import javax.mail.internet.AddressException; 12 import javax.mail.internet.InternetAddress; 13 import javax.mail.internet.MimeMessage; 14 15 public class MailUtils { 16 /** 17 * 18 * @param to:代表给谁发邮件 19 * @param code:代表激活码是什么 20 * @throws MessagingException 21 * @throws AddressException 22 */ 23 24 public static void sendMail(String to,String code) throws Exception{ 25 //1.创建连接对象,连接到邮箱服务器 26 Properties props = new Properties(); 27 28 Session session=Session.getInstance(props, new Authenticator() { 29 30 @Override 31 protected PasswordAuthentication getPasswordAuthentication() { 32 /**创建一个邮箱账号:service@mac.com 123 33 * 默认使用该账号发送邮件 34 */ 35 //return new PasswordAuthentication("service@mac.com", "123"); 36 return new PasswordAuthentication("自己的QQ邮箱", "授权编码"); 37 } 38 39 40 }); 41 42 //2.创建邮件对象 43 MimeMessage message = new MimeMessage(session); 44 //2.1设置发件人 45 /** 46 * service@mac.com是一个字符串, 47 * 将字符串转换成地址:new InternetAddress("service@mac.com") 48 */ 49 message.setFrom(new InternetAddress("自己的QQ邮箱")); 50 51 //2.2设置收件人 52 message.setRecipient(RecipientType.TO, new InternetAddress(to)); 53 54 //2.3设置邮件主题 55 message.setSubject("这是一封激活邮件!"); 56 57 //2.4设置邮件正文 58 /** 59 * ?code="+code+" :表示从外面传入一个激活码 60 */ 61 message.setContent("<h1>来自西瓜瓜购物网站的激活邮件,激活请点击以下链接:</h1> <h3> <a href='http://localhost:8080/Foxmail/ActiveServlet?code="+code+"'> http://localhost:8080/Foxmail/ActiveServlet?code="+code+" </a></h3>", "text/html;charset=UTF-8"); 62 63 //3.发送一封激活邮件 64 Transport.send(message); 65 } 66 67 68 69 }

UUIDUtils.java代码如下:

1 package com.xigua.utils; 2 import java.util.UUID; 3 public class UUIDUtils { 4 //生成随机字符串的工具类 5 public static String getUUID(){ 6 //取消短- 7 return UUID.randomUUID().toString().replace("-", ""); 8 9 } 10 11 }

 

5.编写service包内代码

 

 UserService接口:

1 package com.xigua.service; 2 3 import com.xigua.domain.User; 4 5 public interface UserService { 6 void regist(User user) throws Exception; 7 8 User findByCode(String code) throws Exception; 9 10 void update(User user)throws Exception; 11 }

 

UserServiceImpl实现类:

1 package com.xigua.service.impl; 2 3 import com.xigua.dao.UserDao; 4 import com.xigua.dao.impl.UserDaoImpl; 5 import com.xigua.domain.User; 6 import com.xigua.service.UserService; 7 import com.xigua.utils.MailUtils; 8 9 public class UserServiceImpl implements UserService { 10 11 UserDao userDao = new UserDaoImpl(); 12 13 //业务层用户注册的方法: 14 public void regist(User user) throws Exception { 15 //将数据存入到数据库 16 userDao.regist(user); 17 18 //发送一封激活邮件 19 /** 20 * 直接用发写好的工具类发送邮件 21 */ 22 MailUtils.sendMail(user.getEmail(), user.getCode()); 23 24 } 25 26 @Override 27 //根据激活码查找用户 28 public User findByCode(String code) throws Exception { 29 30 return userDao.findByCode(code); 31 } 32 33 @Override 34 //业务层修改用户的方法 35 public void update(User user) throws Exception { 36 userDao.update(user); 37 38 } 39 40 }

 

 6.编写dao包内代码

 

 UserDao接口:

1 package com.xigua.dao; 2 3 import java.sql.SQLException; 4 5 import com.xigua.domain.User; 6 7 public interface UserDao { 8 9 void regist(User user) throws Exception; 10 11 User findByCode(String code) throws Exception; 12 13 void update(User user)throws Exception; 14 15 }

 

UserDaoImpl实现类:

1 package com.xigua.dao.impl; 2 3 4 5 import java.sql.SQLException; 6 7 import org.apache.commons.dbutils.QueryRunner; 8 import org.apache.commons.dbutils.handlers.BeanHandler; 9 10 import com.xigua.dao.UserDao; 11 import com.xigua.domain.User; 12 13 import com.xigua.utils.JDBCUtils; 14 15 16 public class UserDaoImpl implements UserDao { 17 18 //Dao中保存用户的方法 19 public void regist(User user) throws Exception { 20 21 //QueryRunner queryRunner = new QueryRunner(C3P0Util.getDataSource()); 22 QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource()); 23 //写SQL语句 24 String sql="insert into user values(?,?,?,?,?,?,?);"; 25 26 Object[] params={user.getUid(),user.getUsername(),user.getPassword(),user.getNickname(),user.getEmail(),user.getState(),user.getCode()}; 27 28 // 更新语句 29 queryRunner.update(sql,params); 30 31 } 32 33 @Override 34 //Dao中根据激活码来查询用户的方法 35 public User findByCode(String code) throws Exception { 36 QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource()); 37 String sql="select * from user where code = ?"; 38 User user=queryRunner.query(sql,new BeanHandler<User>(User.class), code); 39 return user; 40 } 41 42 @Override 43 //Dao中修改用户的方法 44 public void update(User user) throws Exception { 45 QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource()); 46 String sql="update user set username=?,password=?,nickname=?,email=?,state=?,code=? where uid=?;"; 47 48 Object[] params={user.getUsername(),user.getPassword(),user.getNickname(),user.getEmail(),user.getState(),user.getCode(),user.getUid()}; 49 // 更新语句 50 queryRunner.update(sql,params); 51 52 } 53 }

  7.编写action包内代码

新建两个Servlet,不是class

 

 

ActiveServlet代码:

1 package com.xigua.action; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 import com.xigua.domain.User; 10 import com.xigua.service.UserService; 11 import com.xigua.service.impl.UserServiceImpl; 12 13 public class ActiveServlet extends HttpServlet { 14 private static final long serialVersionUID = 1L; 15 16 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 17 try { 18 //接收激活码 19 String code = request.getParameter("code"); 20 //根据激活码查用户 21 System.out.println("code值:"+code); 22 UserService userService = new UserServiceImpl(); 23 24 User user=userService.findByCode(code); 25 26 if(user!=null){ 27 //已经查询到,修改用户状态 28 user.setState(1);//状态变为1 29 user.setCode(null);//状态码,点击一次就失效了 30 userService.update(user); 31 request.setAttribute("msg", "恭喜你已经激活成功!请登录~"); 32 33 }else{ 34 //根据激活码没有查询到该用户 35 request.setAttribute("msg", "您的激活码有误,请重新激活!"); 36 } 37 //页面跳转 38 request.getRequestDispatcher("/msg.jsp").forward(request, response); 39 40 } catch (Exception e) { 41 42 e.printStackTrace(); 43 } 44 } 45 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 46 47 doGet(request, response); 48 } 49 50 }

 

 RegistServlet代码:

 

1 package com.xigua.action; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 import com.xigua.domain.User; 10 import com.xigua.service.UserService; 11 import com.xigua.service.impl.UserServiceImpl; 12 import com.xigua.utils.UUIDUtils; 13 14 public class RegistServlet extends HttpServlet { 15 private static final long serialVersionUID = 1L; 16 17 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 try { 19 //接收数据 20 //处理中文乱码 21 request.setCharacterEncoding("UTF-8"); 22 23 String username = request.getParameter("username"); 24 String password = request.getParameter("password"); 25 String nickname = request.getParameter("nickname"); 26 String email = request.getParameter("email"); 27 28 //包装数据 29 User user=new User(); 30 user.setUsername(username); 31 user.setPassword(password); 32 user.setNickname(nickname); 33 user.setEmail(email); 34 35 user.setState(0); //0未激活 1已激活 36 // UUIDUtils.getUUID()默认32位,若不够,在+32位 37 String code = UUIDUtils.getUUID()+UUIDUtils.getUUID(); 38 39 user.setCode(code); 40 41 //调用业务层处理数据 42 UserService userService = new UserServiceImpl(); 43 44 userService.regist(user); 45 46 //页面跳转 47 request.setAttribute("msg", "您已经注册成功!请去邮箱激活~"); 48 request.getRequestDispatcher("/msg.jsp").forward(request, response); 49 50 } catch (Exception e) { 51 // TODO Auto-generated catch block 52 e.printStackTrace(); 53 } 54 } 55 56 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 57 58 doGet(request, response); 59 } 60 61 }

 8.编写JSP代码

注册: regist.jsp 代码

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>注册界面</title> 8 </head> 9 <body> 10 <h1>用户注册</h1> 11 12 <form action="${pageContext.request.contextPath }/RegistServlet" method="post"> 13 <table > 14 <tr> 15 <td>用户名</td> 16 <td><input type="text" name="username"/></td> 17 </tr> 18 <tr> 19 <td>密码</td> 20 <td><input type="password" name="password"/></td> 21 </tr> 22 <tr> 23 <td>昵称</td> 24 <td><input type="text" name="nickname"/></td> 25 </tr> 26 <tr> 27 <td>邮箱</td> 28 <td><input type="text" name="email"/></td> 29 </tr> 30 <tr> 31 32 <td colspan="2"> 33 <input type="submit" value="注册"/> 34 <input type="reset" value="重置"/> 35 </td> 36 </tr> 37 38 39 </table> 40 41 </form> 42 43 44 45 </body> 46 </html>

 

激活界面:msg.jsp代码

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>激活界面</title> 8 </head> 9 <body> 10 <h1>${ msg }</h1> 11 </body> 12 </html>

 

 后续更新中……

 有错请评论下方,谢谢~

 

转载请注明原文地址: https://www.6miu.com/read-45876.html

最新回复(0)