java 实现注册时发送激活邮件并激活

来源:互联网 发布:淘宝网中年秋冬连衣裙 编辑:程序博客网 时间:2024/04/27 18:32

现在许多网站越来越流行注册后通过发送验证邮件方式来完成激活,自己研究了相关示例后,采用James邮件服务器,进行了简单的实现,步骤如下:

运行环境

使用James邮箱服务器,需要创建相应的用户,Foxmail邮箱客户端,MySQL数据库,MyBatis框架,需要导入javax.mail.jar及javax.activation.jar。

数据库表结构

  用户表t_user有五个字段分别为用户名、密码、邮箱地址、激活码、状态: 
  | username | password | email |code |state |

核心代码

业务实体

public class UserInfo {

      private String username;

      private String password;

      private String email;

      private String code;

      private int state;

     

      //省略getter/setter

}

数据访问接口

public interface UserDaoMapper {

      //注册用户

      public int addUser(UserInfo user);

     

      //更新用户状态

      public int updateState(String uuid);

}

MyBatis配置文件

<?xml version="1.0"encoding="UTF-8"?>

 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTDConfig 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

 

 <configuration> 

      <environmentsdefault="development">

         <environmentid="development">

             <transactionManagertype="JDBC"/>

             <!-- 配置数据库连接信息 -->

             <dataSourcetype="POOLED">

                  <propertyname="driver"value="com.mysql.jdbc.Driver"/>

                 <propertyname="url"value="jdbc:mysql://localhost:3306/test"/>

                 <propertyname="username"value="root"/>

                <propertyname="password"value="123456"/>

             </dataSource>

        </environment>

    </environments>    

    <mappers>

      <mapperresource="wanshi/mybatis/UserDaoMapper.xml"/>

    </mappers>

 </configuration>

MyBatis映射文件

<?xml version="1.0"encoding="UTF-8"?>

 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 <mapper namespace="wanshi.mybatis.UserDaoMapper">

      <!-- 增加用户,此功能用于注册用户的邮箱验证     -->

      <insertid="addUser"parameterType="wanshi.mybatis.UserInfo">

            insertinto `t_user` (`username`, `password`, `email`, `code`, `state`)values(#{username},#{password},#{email},#{code},#{state})

      </insert>

     

      <!-- 更新用户状态,用于注册验证成功后的操作 -->

      <updateid="updateState"parameterType="int">

            updatet_user set state=1 where code=#{uuid}

      </update>  

 </mapper>

业务逻辑接口

public interface UserBiz {

      //注册用户

      public boolean register(UserInfo user);  

      //更新用户状态

      public boolean active(String to,Stringcode);  

      //发送激活邮件

      public boolean sendMail(String code);

}

业务逻辑实现UserBizImpl.java

 

importjava.util.Properties;

import java.util.UUID;

import javax.mail.Message;

import javax.mail.Session;

importjavax.mail.Transport;

importjavax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

importwanshi.mybatis.UserDaoMapper;

importwanshi.mybatis.UserInfo;

importwanshi.tools.MyBatisUtil;

 /**

 * 注册用户并发送邮件验证

 * @authorAdministrator

 */

public classUserBizImpl implements UserBiz{

      /**

       * 注册用户,返回是否成功

       */

      @Override

      public booleanregister(UserInfo user) {

            Boolean result=false;

        //生成用户code        

        String code=UUID.randomUUID().toString().replace("-","");       

        user.setCode(code);       

        //添加用户

        int num=MyBatisUtil.getSqlSession().getMapper(UserDaoMapper.class).addUser(user);

        if(num>0){

            //向用户发送激活邮件

            sendMail(user.getEmail(),code);

            result=true;

        }

        return result;

      }

 

      /**

       * 激活用户

       */

      @Override

      public booleanactive(String code) {

            int num=MyBatisUtil.getSqlSession().getMapper(UserDaoMapper.class).updateState(code);

            if(num>0){

                  return true;

            }else{

                  return false;

            }

      }

 

      /**

       * 发送邮件

       */

      @Override

      public booleansendMail(String to, Stringcode) {

        try

            Properties props = new Properties(); 

            props.put("username","accp");  

            props.put("password","accp");  

            props.put("mail.transport.protocol","smtp" ); 

            props.put("mail.smtp.host","mail.com"); 

            props.put("mail.smtp.port","25" ); 

            Session mailSession =Session.getDefaultInstance(props); 

 

            Message msg = new MimeMessage(mailSession);             

            msg.setFrom(new InternetAddress("accp@mail.com")); 

            msg.addRecipients(Message.RecipientType.TO,InternetAddress.parse(to));  

            msg.setSubject("激活邮件");  

            msg.setContent("<h1>此邮件为官方激活邮件!请点击下面链接完成激活操作!</h1><h3><ahref='http://localhost:8080/MyDemo/ActiveServlet?code="+code+"'>http://www.wanshi.com/MyDemo/ABCDKJK838845490SERVLET</a></h3>","text/html;charset=UTF-8");

            msg.saveChanges(); 

            Transport transport =mailSession.getTransport("smtp"); 

            transport.connect(props.getProperty("mail.smtp.host"),props.getProperty("username"),props.getProperty("password"));  

            transport.sendMessage(msg,msg.getAllRecipients()); 

            transport.close();    

        } catch(Exception e) { 

            e.printStackTrace(); 

            System.out.println(e); 

            return false

        } 

        return true

      }

 

}

注册跳转的Servlet

protected void doGet(HttpServletRequest request, HttpServletResponseresponse)throws ServletException, IOException {

            request.setCharacterEncoding("utf-8");

            //封装业务对象

            UserInfouser=new UserInfo();

            user.setUsername(request.getParameter("username"));

            user.setPassword(request.getParameter("password"));

            user.setEmail(request.getParameter("email"));

           

            //实例化业务逻辑对象

            UserBizub=new UserBizImpl();

            boolean isadd=ub.register(user);

            response.setContentType("text/html;charset=gb2312");

            if(isadd){

                  response.getWriter().println("注册成功,邮件已发送,请尽快进行验证!");

            }else{

                  response.getWriter().println("注册失败!");

            }           

      }


激活跳转的Servlet

protected void doGet(HttpServletRequest request, HttpServletResponseresponse)throws ServletException, IOException {

            //实例化业务逻辑对象

            UserBizub=new UserBizImpl();

            boolean isadd=ub.active(request.getParameter("code"));

            System.out.println(isadd);

            response.setContentType("text/html;charset=gb2312");

            response.getWriter().println("恭喜,注册成功!");

      }

用到的工具类

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

 

public class MyBatisUtil {

      /**

    * 获取SqlSessionFactory

    * @return SqlSessionFactory

    */

   public staticSqlSessionFactory getSqlSessionFactory() {

       String resource = "mybatis-config.xml";

       InputStream is = MyBatisUtil.class.getClassLoader().getResourceAsStream(resource);

       SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);

       return factory;

    }

    /**

    * 获取SqlSession

    * @return SqlSession

    */

    public staticSqlSession getSqlSession() {

       return getSqlSessionFactory().openSession();

   }    

    /**

    * 获取SqlSession

    * @param isAutoCommit

    *  true 表示创建的SqlSession对象在执行完SQL之后会自动提交事务

    *  false 表示创建的SqlSession对象在执行完SQL之后不会自动提交事务,这时就需要我们手动调用sqlSession.commit()提交事务

    * @return SqlSession

    */

    public staticSqlSession getSqlSession(booleanisAutoCommit) {

       return getSqlSessionFactory().openSession(isAutoCommit);

    } 

}

前端页面:register.jsp

<%@ pagelanguage="java"contentType="text/html; charset=utf-8"  pageEncoding="utf-8"%>

<%@ taglibprefix="c"uri="http://java.sun.com/jstl/core_rt"%>

<%

String path =request.getContextPath();

String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<base href="<%=basePath%>"/>

<title>登录页面</title>

</head>

<body>

 

<div id="register">

      <h1>欢迎登录</h1>

      <formid="loginForm"method="post"action="reg">

            <table>

            <tr>

                  <tdclass="field">用户名:</td>

                  <td><inputtype="text"id="username"name="username"/></td>

            </tr>

            <tr>

                  <tdclass="field">密码:</td>

                  <td><inputtype="password"id="password"name="password" /></td>

            </tr>

            <tr>

            <td>邮箱:</td>

            <td><inputtype="text"id="email"name="email"/></td>

            </tr>

            <tr>

                  <td>&nbsp;</td>

                  <td><inputtype="submit"name="submit"value="立即注册"/></td>

            </tr>

            </table>

      </form>

</div>

</body>

</html>

当用户注册时

 1、为用户生成随机的激活码(此激活码是添加根据代码规则自动生成的,这里的激活码以随机生成的UUID为例); 
 2、添加一条用户记录; 
 3、向用户发送激活邮件,此处可以添加链接直接跳转到用户邮箱登录界面。


  激活邮件如下: 


激活

用户点击邮箱中的链接后,系统根据用户点击链接发来的激活码去数据库中更新与该激活码匹配的用户状态,完成用户注册过程。


0 0
原创粉丝点击