注册邮箱验证激活技术
一.先说思路
//1.数据库加三个字段,state:(0:未激活,1:激活成功),ActiCode:(放激活码),token_exptime(过期时间,用来验证激活邮件是否过期)
//2.用户填写资料,点击注册,插入数据成功,state字段默认是0,同时生成一个ActiCode(用传过来的邮箱、密码、和当前时间加密形成)也存入数据库
//3.发送邮件。。。提示用户登录邮箱激活。。。邮件中带一个激活成功页的URL,URL里有两个参数(1,用户ID,2:激活码)
//4.用户登录邮箱点击链接,来到处理激活的业务逻辑页面或Servlet,得到URL中两个参数,以这两个参数为条件查询数据库里的数据,如果有,取当前时间和之前存入数据库的过期时间作比较,看是否过期,过期,删除数据库中该条记录,并转到失败页面,没过期,查看链接传过来的激活码与数据库字段激活码是否一致,不一致,同样删除数据库中该条记录,并跳转到激活失败界面,一致,则将字段state为1,激活成功,转到激活成功页。。。
二、具体实现代码
1.首先,准备一个简单的测试页面
2.点击提交注册,来到user.action?op=reg,注意带的参数op指我要做的操作,用于后面的Servlet做判断该做什么操作,下面的代码完成了形成激活码、过期时间等表示当前注册用户的状态的信息存入数据库并发送邮件的过程。(邮件内容自定义,可以忽略我的)
package com.nh.web.servlets; import java.io.IOException; import java.io.PrintWriter; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.UUID; import javax.naming.NamingException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.nh.dao.DBHelper; import com.nh.utils.Encrypt; import com.nh.utils.SendEmail; public class UserServlet extends CommonServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 取出op String op = request.getParameter("op"); // 判断op是什么,调用不同的方法做处理 try { if (op != null && !"".equals(op)) { if ("reg".equals(op)) { regOP(request, response); } } else { } } catch (Exception e) { e.printStackTrace(); response.sendRedirect("common/500.jsp"); } } private void regOP(HttpServletRequest request, HttpServletResponse response) throws IOException, SQLException, NamingException { // 1.数据库加两个字,state字段(0:未激活,1:激活成功),ActiCode:(放激活码) // 2.用户填写资料,插入数据成功,state字段默认是0,同时生成一个ActiCode也存入数据库 // 3.提示用户激活。。。发送邮件。。。邮件中带一个激活成功页的URL,URL里有两个参数(1,用户ID,2:激活码) // 4.用户点击链接,回到激活成功页。。。激活成功页的Load事件,得到两个参数,以这两个参数为条件查询数据库里的数据,如果有,修改字段state为1,反之。。提示激活失败,重新激活。。 String email=request.getParameter("email"); String pwd=Encrypt.md5(request.getParameter("pwd")); Calendar c = Calendar.getInstance(); //现在的时间(单位:毫秒) //TODO:时间换算问题,如何处理int和long之间的关系 long time = c.getTimeInMillis(); //创建激活码 String token=Encrypt.md5(email+pwd+time); //过期时间为24小时后 // int token_exptime=(int)(time+1000*60*60*24); String token_exptime=(time+1000*20)+""; //这里测试是用的20秒 String id=UUID.randomUUID().toString(); String sql="insert into tb_user(id,username,pwd,token,token_exptime,regtime,status) values (?,?,?,?,?,sysdate,0)"; List
这是QQ邮箱设置,一般开启1、2、4
这是收到的激活邮件
根据用户所填邮箱跳转相应邮箱登录地址的代码
package com.nh.web.servlets; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DoEmailLoginServlet extends CommonServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String op = request.getParameter("op"); // 判断op是什么,调用不同的方法做处理 try { if (op != null && !"".equals(op)) { if ("emaillogin".equals(op)) { emailloginOP(request, response); } } else { } } catch (Exception e) { e.printStackTrace(); response.sendRedirect("common/500.jsp"); } } private void emailloginOP(HttpServletRequest request, HttpServletResponse response) throws IOException { //判断用户邮箱是什么,跳到指定邮箱登陆界面 String email=request.getParameter("email"); //572480349@qq.com String pwd=request.getParameter("pwd"); String addrstr=email.split("@")[1]; //qq.com if( "qq.com".equals(addrstr)){ addrstr="https://mail.qq.com"; }else if( "163.com".equals(addrstr)){ addrstr="http://mail.163.com/"; }else if( "126.com".equals(addrstr)){ addrstr="http://www.126.com/"; }else if( "sina.com".equals(addrstr)){ addrstr="http://mail.sina.com.cn/"; }else if( "hotmail.com".equals(addrstr)){ addrstr="https://login.live.com"; } response.sendRedirect("emailaction.jsp?email="+email+"&pwd="+pwd+"&addrstr="+addrstr); } }
具体页面我就不一一给了,直接上激活验证代码吧
package com.nh.web.servlets; import java.io.IOException; import java.io.PrintWriter; import java.lang.reflect.InvocationTargetException; import java.sql.SQLException; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import javax.naming.NamingException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.lofter.bean.User; import com.nh.dao.DBHelper; import com.nh.utils.DataExistAlreadyException; public class EmailActivateCheckServlet extends CommonServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 取出op String op = request.getParameter("op"); // 判断op是什么,调用不同的方法做处理 try { if (op != null && !"".equals(op)) { if( "activate".equals(op)){ activateOP(request,response); } } else { } } catch (Exception e) { e.printStackTrace(); response.sendRedirect("common/500.jsp"); } } private void activateOP(HttpServletRequest request, HttpServletResponse response) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, Exception { //获取参数token的值,即激活识别码。 //将它与数据表中的用户信息进行查询对比,如果有相应的数据集,判断是否过期,如果在有效期内则将对应的用户表中字段status设置1,即已激活,这样就完成了激活功能。 String id=request.getParameter("id"); String token=request.getParameter("token"); Calendar c = Calendar.getInstance(); //现在的时间(单位:毫秒) long curtime = c.getTimeInMillis(); String sql="select id,token_exptime,token,username,pwd from tb_user where status=0 and token=?"; List
网站题目:注册邮箱验证激活技术
文章地址:http://myzitong.com/article/cpdsoh.html