目录
第二步:向邮箱发送激活码(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.qq.com");
//端口号,QQ邮箱端口587
props.put("mail.smtp.port", "587");
// 此处填写,写信人的账号
props.put("mail.user", "2596877535@qq.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("w2596877535@163.com", "123456");
} 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(2592000);
psdCookie.setMaxAge(2592000);
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;
}