Java实现邮箱验证


一.创建数据库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>

 

 后续更新中……

 有错请评论下方,谢谢~

 

posted @ 2017-07-26 01:06  大西瓜猫  阅读(11905)  评论(0编辑  收藏  举报