javaWeb实现邮箱验证与用户账户激活功能

目录

一、为什么要进行邮箱验证

二、实现向邮箱发送信息

1.注册一个网易邮箱账号或QQ邮箱并开启相关服务

2.导入相关jar包

3.实现发送邮件的代码

4.测试

 三、实现生成邮箱验证信息和激活功能

1.实现一个含邮箱的注册界面

 2.向邮箱发送激活码(在Controller层实现)

 3.实现激活以及登录时判断是否激活


一、为什么要进行邮箱验证

1.网站的安全性增加,防止恶意注册。

2.作为用户丢失密码后的验证渠道。相比短信,邮箱不存在费用问题,但前提是用户填写的邮箱是正确的。

3.CRM(客户关系管理)数据收集。邮箱是一种相对于短信更便宜的营销渠道,发送不费成本,用户也不会极为反感。作为后续的客户维护渠道,邮箱是不可舍弃的资源。验证过的邮箱,很大程序上增加了用户打开的几率。

二、实现向邮箱发送信息
1.注册一个网易邮箱账号或QQ邮箱并开启相关服务

        QQ邮箱相关服务开启(163邮箱类似)

 开启后会获得一个密码,记住并复制下来,后面要用

2.导入相关jar包

3.实现发送邮件的代码
public class EmailUtils {
    public static void sendEmail(String email,String authCode) throws MessagingException {
        // 创建Properties 类用于记录邮箱的一些属性
        Properties props = new Properties();
        // 表示SMTP发送邮件,必须进行身份验证
        props.put("mail.smtp.auth", "true");
        //此处填写SMTP服务器
        props.put("mail.smtp.host", "smtp.qq.com");
        //端口号,QQ邮箱端口587
        props.put("mail.smtp.port", "587");
        // 此处填写,写信人的账号
        props.put("mail.user", "33******61@qq.com");
        // 此处填写16位STMP口令
        props.put("mail.password", "********");//填写之前开启服务后获得的密码

        // 构建授权信息,用于进行SMTP进行身份验证
        Authenticator authenticator = new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                // 用户名、密码,都不用改直接copy
                String userName = props.getProperty("mail.user");
                String password = props.getProperty("mail.password");
                return new PasswordAuthentication(userName, password);
            }
        };
        // 使用环境属性和授权信息,创建邮件会话
        Session mailSession = Session.getInstance(props, authenticator);
        // 创建邮件消息
        MimeMessage message = new MimeMessage(mailSession);
        // 设置发件人,
        InternetAddress form = new InternetAddress(props.getProperty("mail.user"));
        message.setFrom(form);
        // 设置收件人的邮箱
        InternetAddress to = new InternetAddress(email);
        message.setRecipient(Message.RecipientType.TO, to);
        // 设置邮件标题
        message.setSubject("验证码信息");
        // 设置邮件的内容体
        message.setContent("验证码:"+authCode, "text/html;charset=UTF-8");
        // 最后当然就是发送邮件啦
        Transport.send(message);
    }

}
4.测试
public class TestDome1 {
    public static void main(String[] args){
        try {
            //使用其他QQ邮箱或者163邮箱接收信息
            EmailUtils.sendEmail("21******75@qq.com","এ揽风挽你༊");
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

 三、实现生成邮箱验证信息和激活功能
1.实现一个含邮箱的注册界面

 2.向邮箱发送激活码(在Controller层实现)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	Teacher teacher = new Teacher();
	try {
		BeanUtils.populate(teacher, request.getParameterMap());
		//随机生成激活码
		teacher.setActivatecode(UUID.randomUUID().toString());
		teacher.setState("N");
		TeacherService teacherService = new TeacherServiceImpl();
		int flag = teacherService.register(teacher);
		if(flag==1){
			response.getWriter().print("该用户已经存在!");
		}else if(flag==2){
             //给一个带有激活码的激活的地址
		     String authCode = "<a href=http://localhost:8080/schoolpro/ActivateCotroller?activatecode="+teacher.getActivatecode()+">点击激活</a>";
		     EmailUtils.sendEmail("18*******30@163.com",authCode);
		     response.getWriter().print("注册成功!,激活码已发送,请到邮箱激活!");
		}else{
			response.getWriter().print("注册失败!");
		}
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} 

 

 3.实现激活以及登录时判断是否激活

        封装对数据库的连接

**
 * 封装对数据库的连接等
 */
public class DButils {
    public static Connection getConnection(){
        Properties properties = ReadFile.readFile("File/db.properties");
        String driver = (String)properties.get("driver");
        String url = (String)properties.get("url");
        String user = (String)properties.get("user");
        String password = (String)properties.get("password");

        try {

            Class.forName(driver);
            Connection connection=DriverManager.getConnection(url,user,password);
            return  connection;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
    //关闭数据库连接
    public  static void closeDB(Connection conn, PreparedStatement ps, ResultSet rs){
        if (rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (ps!=null){
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

}

        dao层方法实现

 @Override
    public String findState(String name) {
        Connection conn = null;
        String sql = null;
        ResultSet rs=null;
        String state=null;
        PreparedStatement ps =null;
        conn=DButils.getConnection();
        sql="select state from teacher where name=?";
        try {
            ps=conn.prepareStatement(sql);
            ps.setString(1,name);
            rs=ps.executeQuery();
            while (rs.next()){
                state=rs.getString("state");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        DButils.closeDB(conn,ps,rs);
        return state;
    } 

@Override
    public int updateTeacherByActivateCode(String activateCode) {
        Connection conn = null;
        String sql = null;
        ResultSet rs=null;
        PreparedStatement ps =null;
        conn=DButils.getConnection();
        int i=0;
        sql="update teacher set state=? where activatecode=?";
        try {
            ps=conn.prepareStatement(sql);
            ps.setString(1,"Y");
            ps.setString(2,activateCode);
            i=ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        DButils.closeDB(conn,ps,rs);
        return i;
    }

        service层方法实现

 /**
     * 查询状态
     */
    @Override
    public boolean showState(String name) {
        TeacherDao teacherDao = new TeacherDaoImpl();
        String state = teacherDao.findState(name);
        if ("Y".equals(state)){
            return true;
        }
        return false;
    }

    /**
     * 修改激活码状态
     */
    @Override
    public boolean activateTeacher(String activateCode) {
        TeacherDao teacherDao = new TeacherDaoImpl();
        int i = teacherDao.updateTeacherByActivateCode(activateCode);
        if (i>0){
            return true;
        }
        return false;
    }

        提示激活状态界面(infor.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${stateinfor}
</body>
</html>

         实现提示激活状态功能(Controller)

@WebServlet("/EmailActivate")
public class EmailActivate extends HttpServlet{
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String activatecode=req.getParameter("activatecode");
        TeacherService teacherService = new TeacherServiceImpl();
        boolean flag = teacherService.activateTeacher(activatecode);
        if (flag==true){
            req.setAttribute("stateinfor","激活成功");
            req.getRequestDispatcher("/infor.jsp").forward(req,resp);
        }else {
            req.setAttribute("stateinfor","激活失败");
            req.getRequestDispatcher("/infor.jsp").forward(req,resp);
        }

    }
}

 

         在实现登录的Servlet里判断是否激活

//判断用户名和密码
                String name = req.getParameter("name");
                String password = req.getParameter("password");
                TeacherService teacherService = new TeacherServiceImpl();
                boolean flag = teacherService.showState(name);
                if (flag){
                    flag = teacherService.login(name,password);
                    if (flag){
                        req.getSession().setAttribute("name",name);
                        resp.sendRedirect("/schoolmanage/pages/admin_main.jsp");
                    }else {
                        req.setAttribute("loginfail","用户名和密码有错!");
                        req.getRequestDispatcher("/login.jsp").forward(req,resp);

                    }

                }else {
                    req.setAttribute("statefail","用户未激活");
                    req.getRequestDispatcher("/login.jsp").forward(req,resp);
                }
                }else {
                req.setAttribute("codefail","验证码错误!请重新输入");
                req.getRequestDispatcher("/login.jsp").forward(req,resp);
            }

 ​​

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值