目录
一、为什么要进行邮箱验证
二、实现向邮箱发送信息
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);
}