大家好,欢迎来到IT知识分享网。
目录
第二步:向邮箱发送激活码(RegisterController)
一、介绍
JavaWeb邮箱验证是指在JavaWeb开发中,对用户输入的邮箱进行验证的一种技术。其目的是确保用户输入的邮箱是有效的,从而提高系统的安全性和用户操作的准确性。
邮箱验证的过程可以分为以下几步:
- 获取用户输入的邮箱地址。
- 利用正则表达式对邮箱地址进行基本的格式验证,确保它符合邮箱地址的基本规则,例如包含@符号、以及正确的域名格式等。
- 发送验证邮件给用户输入的邮箱地址。验证邮件通常包含一个链接,用户需要点击该链接进行验证。
- 用户点击验证链接后,服务器接收到验证请求,验证链接的有效性。
- 验证链接有效后,将用户的邮箱状态设置为已验证。
- 在用户登录或进行其他操作时,检查邮箱状态是否为已验证,以确保只有已验证邮箱的用户才能正常使用系统功能。
需要注意的是,邮箱验证的过程需要与SMTP服务器进行交互,发送和接收邮件。在JavaWeb开发中,可以使用JavaMail和Java Activation Framework (JAF)等库来实现邮件发送和接收的功能。
此外,为了提高用户体验和系统的安全性,还可以对用户的邮箱进行重复验证、验证码验证等操作,以确保输入的邮箱地址是唯一有效的。
1.1、邮箱验证的业务流程设计图
1.2、邮箱验证分为三个阶段
阶段一:实现向邮箱发送信息
第一步:注册邮箱和开启相关服务(163开启的过程类似)
先登录邮箱找到设置,然后账号里面有个POP3/SMTP服务,然后开启它的服务状态就可以了,会获得一个密钥,记得保存下来。
第二步:导包
第三步:编写实现发送邮件的代码
package com.school.utils;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
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..com");
//端口号,邮箱端口587
props.put("mail.smtp.port", "587");
// 此处填写,写信人的账号
props.put("mail.user", "2596877535@.com");
// 此处填写16位STMP口令
props.put("mail.password", "jjcspukgnslgdjca");//这个STMP口令就是粘贴刚刚邮箱获得到的密钥
// 构建授权信息,用于进行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);
}
}
第四步:测试
package com.school.test; import com.school.utils.EmailUtils; import javax.mail.MessagingException; import java.sql.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Test { @org.junit.Test public void test01() { try { EmailUtils.sendEmail("", ""); } catch (MessagingException e) { e.printStackTrace(); } } }
第五步:效果展示
阶段二:实现生成邮箱验证信息和激活功能
第一步:注册界面
第二步:向邮箱发送激活码(RegisterController)
//注册 if ("register".equals(action)){ //接收数据以及封装 Teacher teacher = new Teacher(); try { BeanUtils.populate(teacher,req.getParameterMap()); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } //验证 Map<String, String> error = ValidateDemo.validateTeacher(teacher); if (error.isEmpty()){ //激活码 String activatecode = UUID.randomUUID().toString(); teacher.setActivatecode(activatecode); teacher.setState("N"); String Activatecode = "<a href=http://localhost/schoolpro02/EmailActivate?activatecode="+teacher.getActivatecode()+">点击激活</a>"; //调用service方法 TeacherService teacherService = new TeacherServiceImpl(); int flag = teacherService.register(teacher); if (flag==0){ req.getRequestDispatcher("/pages/registerfail.jsp").forward(req,resp); } if (flag == 1){ try { EmailUtils.sendEmail(teacher.getEmail(),Activatecode); } catch (MessagingException e) { e.printStackTrace(); } req.getRequestDispatcher("/pages/registersuccess.jsp").forward(req,resp); } if (flag == 2){ req.setAttribute("registerInfor","该用户已存在!"); req.getRequestDispatcher("/register_teacher.jsp").forward(req,resp); } }else { req.setAttribute("error",error); req.getRequestDispatcher("/register_teacher.jsp").forward(req,resp); } }
第三步:激活
@Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String activatecode = req.getParameter("activatecode"); TeacherService teacherService = new TeacherServiceImpl(); Teacher teacher = teacherService.activeTeacher(activatecode); teacher.setState("Y"); teacherService.updateTeacher(teacher); resp.getWriter().print("恭喜,激活成功!"); }
阶段三:实现登录时判断邮箱是否激活
第一步:登录界面
第二步:判断是否激活
Controller层
//登录 if ("login".equals(action)) { String checkcode = req.getParameter("checkcode"); String infor = (String) req.getSession().getAttribute("infor"); if (checkcode != null && checkcode.equalsIgnoreCase(infor)){ String name = req.getParameter("name"); String password = req.getParameter("password"); TeacherService teacherService = new TeacherServiceImpl(); //通过名字得到它的状态 boolean flag = teacherService.showState(name); if (flag){ Teacher teacher = new Teacher(); try { BeanUtils.populate(teacher,req.getParameterMap()); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } Map<String, String> error = ValidateDemo.validateLogin(teacher); if (error.isEmpty()){ flag = teacherService.login(name, password); if (flag){ //判断是否需要用户名和密码 String[] autoLogins = req.getParameterValues("remember"); if (autoLogins != null && autoLogins.length > 0){ //记录用户名和密码 Cookie nameCookie = new Cookie("name", name); Cookie psdCookie = new Cookie("password",password); nameCookie.setMaxAge(); psdCookie.setMaxAge(); nameCookie.setPath("/schoolpro02"); psdCookie.setPath("/schoolpro02"); resp.addCookie(nameCookie); resp.addCookie(psdCookie); //设置一个登录成功的标志 req.getSession().setAttribute("name",name); req.getRequestDispatcher("/pages/index.jsp").forward(req,resp); }else { req.getSession().setAttribute("name",name); req.getRequestDispatcher("/pages/index.jsp").forward(req,resp); } }else { req.setAttribute("fail","登录失败!"); req.getRequestDispatcher("/login.jsp").forward(req,resp); } }else { req.setAttribute("error",error); 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); } }
Service层
@Override public boolean showState(String name) { TeacherDaoImpl teacherDao = new TeacherDaoImpl(); String state = teacherDao.findState(name); if ("Y".equals(state)){ return true; } return false; }
Dao层
//通过名字查询状态 @Override public String findState(String name) { Connection connection = null; PreparedStatement ps = null; ResultSet rs = null; String state = null; connection = DBUtils.getConnection(); String sql = "SELECT state from teacher where NAME = ?"; try { ps = connection.prepareStatement(sql); ps.setString(1,name ); rs = ps.executeQuery(); while (rs.next()){ state = rs.getString("state"); } } catch (SQLException e) { e.printStackTrace(); } DBUtils.closeDB(connection,ps,rs); return state; }
最后:效果演示
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/121876.html