註冊郵箱驗證啟用技術
一.先說思路
//1.資料庫加三個欄位,state:(0:未啟用,1:啟用成功),ActiCode:(放啟用碼),token_exptime(過期時間,用來驗證啟用郵件是否過期)
//2.使用者填寫資料,點選註冊,插入資料成功,state欄位預設是0,同時生成一個ActiCode(用傳過來的郵箱、密碼、和當前時間加密形成)也存入資料庫
//3.傳送郵件。。。提示使用者登入郵箱啟用。。。郵件中帶一個啟用成功頁的URL,URL裡有兩個引數(1,使用者ID,2:啟用碼)
//4.使用者登入郵箱點選連結,來到處理啟用的業務邏輯頁面或Servlet,得到URL中兩個引數,以這兩個引數為條件查詢資料庫裡的資料,如果有,取當前時間和之前存入資料庫的過期時間作比較,看是否過期,過期,刪除資料庫中該條記錄,並轉到失敗頁面,沒過期,檢視連結傳過來的啟用碼與資料庫欄位啟用碼是否一致,不一致,同樣刪除資料庫中該條記錄,並跳轉到啟用失敗介面,一致,則將
二、具體實現程式碼
1.首先,準備一個簡單的測試頁面<body> <div id="main" style="margin:0 auto;width:500px;"> <form id="reg" action="user.action?op=reg" method="post"> <p> E-mail:<input type="text" class="input" name="email" id="email"> </p> <p> 密 碼:<input type="password" class="input" name="pwd" id="pwd"> </p> <p> <input type="submit" class="btn" value="提交註冊" > </p> </form> </div> </body>
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<Object> params=new ArrayList<Object>(); params.add(id); params.add(email); params.add(pwd); params.add(token); params.add(token_exptime); DBHelper db=new DBHelper(); int r=db.doUpdate(sql, params); //儲存註冊資訊 if( r>0 ){ //傳送郵件 ///郵件的內容 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); StringBuffer sb=new StringBuffer("<div style=\"width:660px;overflow:hidden;border-bottom:1px solid #bdbdbe;\"><div style=\"height:52px;overflow:hidden;border:1px solid #464c51;background:#353b3f url(http://www.lofter.com/rsc/img/email/hdbg.png);\"><a href=\"http://www.lofter.com?mail=qbclickbynoticemail_20120626_01\" target=\"_blank\" style=\"display:block;width:144px;height:34px;margin:10px 0 0 20px;overflow:hidden;text-indent:-2000px;background:url(http://www.lofter.com/rsc/img/email/logo.png) no-repeat;\">LOFTER</a></div>"+"<div style=\"padding:24px 20px;\">您好,"+email+"<br/><br/>LOFTER是一款\"專注興趣、分享創作\"的輕部落格產品,旨在為\"熱愛記錄生活、追求時尚品質、崇尚自由空間\"的你,打造一個全新而定展示平臺!<br/><br/>請點選下面連結啟用賬號,24小時生效,否則重新註冊賬號,連結只能使用一次,請儘快啟用!</br>"); sb.append("<a href=\"http://localhost:8080/mailtest/emailcheck.action?op=activate&id="); sb.append(id); sb.append("&token="); sb.append(token); sb.append("\">http://localhost:8080/mailtest/emailcheck.action?op=activate&id="); sb.append(id); sb.append("&token="); sb.append(token); sb.append("</a>"+"<br/>如果以上鍊接無法點選,請把上面網頁地址複製到瀏覽器位址列中開啟<br/><br/><br/>LOFTER,專注興趣,分享創作<br/>"+sdf.format(new Date())+ "</div></div>" ); //傳送郵件 SendEmail.send(email, sb.toString()); } response.sendRedirect("doEmail.action?op=emaillogin&email="+email+"&pwd="+pwd); } }
傳送郵件的程式碼,這裡需要匯入javax.mail的包,即mail.jar,如果發件人郵箱是QQ郵箱還要去QQ郵箱開啟smtp和其他兩個協議,我這裡用的163郵箱就不需要設定
package com.nh.utils;
import java.util.Date;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/**
*
* @author Qixuan.Chen
*/
public class SendEmail {
public static final String HOST = "smtp.163.com";
// public static final String PROTOCOL = "smtp";
// public static final int PORT = 25;
public static final String FROM = "[email protected]";//發件人的email
public static final String PWD = "xxxx";//發件人密碼
/**
* 獲取Session
* @return
*/
private static Session getSession() {
Properties props = new Properties();
props.put("mail.smtp.host", HOST);//設定伺服器地址
// props.put("mail.store.protocol" , PROTOCOL);//設定協議
// props.put("mail.smtp.port", PORT);//設定埠
props.put("mail.smtp.auth" , "true");
Authenticator authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(FROM, PWD);
}
};
Session session = Session.getDefaultInstance(props , authenticator);
return session;
}
public static void send(String toEmail , String content) {
Session session = getSession();
try {
// System.out.println("--send--"+content);
// Instantiate a message
Message msg = new MimeMessage(session);
//Set message attributes
msg.setFrom(new InternetAddress(FROM));
InternetAddress[] address = {new InternetAddress(toEmail)};
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject("賬號啟用郵件");
msg.setSentDate(new Date());
msg.setContent(content , "text/html;charset=utf-8");
//Send the message
Transport.send(msg);
}
catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
這是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"); //[email protected]
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<Object> params=new ArrayList<Object>();
params.add( token );
DBHelper db=new DBHelper();
User u=db.findSingleObject(User.class, sql, params);
String email=u.getUsername();
String pwd=u.getPwd();
if( u!=null ){
long token_exptime=Long.parseLong(u.getToken_exptime());
if( curtime>token_exptime ){
//啟用碼過期,先刪除該使用者記錄,然後重新發送郵件
sql="delete from tb_user where id='"+u.getId()+"'";
db.doUpdate(sql, null);
response.sendRedirect("actionfailer.jsp?email="+email+"&pwd="+pwd);
// throw new DataExistAlreadyException("啟用碼已過期!");
return;
}else{
//驗證啟用碼是否正確
if( token.equals(u.getToken())){
//啟用成功, //並更新使用者的啟用狀態,為已啟用
sql="update tb_user set status=1 where id='"+u.getId()+"'";
db.doUpdate(sql, null);
response.sendRedirect("actionsuccess.jsp");
}else{
sql="delete from tb_user where id='"+u.getId()+"'";
db.doUpdate(sql, null);
response.sendRedirect("actionfailer.jsp?email="+email+"&pwd="+pwd);
return;
// throw new DataExistAlreadyException("啟用碼不正確");
}
}
}
}
}
package com.nh.web.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public abstract class CommonServlet extends HttpServlet {
private static final long serialVersionUID = 3893961453320250657L;
private String saveFilePath="";
protected String basePath="";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
saveFilePath=req.getRealPath("/");
HttpSession session=req.getSession();
ServletContext application=session.getServletContext();
if( application.getAttribute("basePath")!=null ){
basePath=(String) application.getAttribute("basePath");
}
super.service(req, resp);
}
}
package com.lofter.bean;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private static final long serialVersionUID = -1989259749641485708L;
private String id;
private String username; // --賬戶
private String pwd; // --密碼
private String nickname; // --名稱
private String autograph; // --個人簽名
private String head; // --頭像
private Date regtime; // --註冊時間
private String token; // --賬號啟用碼
private String token_exptime; // --啟用碼有效期
private Integer status; // --啟用狀態 ,0-未啟用,1-已啟用
public User() {
super();
}
public User(String id, String username, String pwd, String nickname,
String autograph, String head, Date regtime, String token,
String token_exptime, Integer status) {
super();
this.id = id;
this.username = username;
this.pwd = pwd;
this.nickname = nickname;
this.autograph = autograph;
this.head = head;
this.regtime = regtime;
this.token = token;
this.token_exptime = token_exptime;
this.status = status;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getAutograph() {
return autograph;
}
public void setAutograph(String autograph) {
this.autograph = autograph;
}
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public Date getRegtime() {
return regtime;
}
public void setRegtime(Date regtime) {
this.regtime = regtime;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getToken_exptime() {
return token_exptime;
}
public void setToken_exptime(String token_exptime) {
this.token_exptime = token_exptime;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
}
相關推薦
註冊郵箱驗證啟用技術
一.先說思路 //1.資料庫加三個欄位,state:(0:未啟用,1:啟用成功),ActiCode:(放啟用碼),token_exptime(過期時間,用來驗證啟用郵件是否過期) //2.使用者填寫資料,點選註冊,插入資料成功,state欄位預設是0,同時生成一個ActiC
JavaMail - 註冊登陸郵箱驗證啟用
前言: 1、郵件傳送協議 - SMTP,預設埠號 25。 用於把使用者郵件從一個伺服器轉到下一個伺服器 2、郵件接收協議 - POP3,預設埠號 110。 用於支援使用客戶端遠端管理在伺服器上的電子郵件 3、搭建郵件伺服器(易郵郵件伺服器 + Foxmail
C# 註冊郵箱驗證的實現代碼
static 別名 subject php sin 附件 sbo 參考 子郵件 本文介紹下,C#實現註冊用戶時,通過郵箱進行驗證的思路與代碼,有需要的朋友,不妨參考下。 一、思路 1,數據庫加兩個字,state字段(0:未激活,1:激活成功),ActiCode:(放激
用戶登錄註冊之驗證碼技術實現
function 驗證碼 用戶登錄 用戶名 change 對於一些惡意強暴破解密碼的行為(即通過硬性嘗試用戶名密碼進行破解),可以采用驗證碼對其進行抵禦,對於一些程序可以識別驗證碼,則需要對驗證碼形式進行多樣化設計。用戶登錄時設置驗證碼代碼實現:頁面<script type=
JavaMail實現註冊郵箱驗證案例
Java郵箱驗證在日常生活中,我們在一個網站中註冊一個賬戶時,往往在提交個人信息後,網站還要我們通過手機或郵件來驗證,郵件的話大概會是下面這個樣子的:用戶通過點擊鏈接從而完成註冊,然後才能登錄。 也許你會想,為什麽要這麽麻煩直接提交註冊不就行了嗎?這其中很大一部分原因是為了防止惡意註冊。接下來讓我們一起來使用
織夢會員註冊郵箱驗證傳送郵件配置教程
環境要求 主機465埠是開啟和放行的 php擴充套件openssl是開啟的 php擴充套件sockets是開啟的 1、QQ郵箱 或者 163郵箱 126郵箱 開啟SMTP服務,拿到授權碼,根據自己的來 QQ郵箱開啟SMTP服務 和 獲取授權碼 163郵箱開啟SM
Kaggle註冊郵箱驗證不過問題(尤其是qq郵箱)
在我下面的連結中下載一個谷歌瀏覽器的外掛 !!!!!!!!!! 劃重點!!!!!!!!!! 一定要用谷歌瀏覽器才可以!!!!! 把外掛裝在谷歌瀏覽器裡面!!! 裡面會有一個教程,教你如何把外掛個裝進去,但是我試了一下,我解壓完之後在裝的時候並不能開啟,但是我直接開啟
使用Flask實現郵箱驗證啟用和使用者管理功能
Flask實現的功能: 使用者註冊增加郵箱驗證啟用功能 增加使用者管理功能(登入和登出) 目錄結構: 使用者註冊增加郵箱驗證啟用功能 1.user模型更新: # 生成賬戶啟用的token def generate_a
GitLab8取消使用者註冊郵箱驗證功能
## 目錄根據自己git安裝的目錄自行修改,為防止萬一,對所有修改的檔案進行備份 ==========================================================
javax.mail開發註冊郵箱驗證
一、匯入maven依賴<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId>
Java實現註冊郵箱啟用驗證
Java實現註冊郵箱啟用驗證 置頂 2013年12月26日 18:05:07 kenhins 閱讀數:25706 標籤: 郵箱 郵件 java hashmap 加密 更多 個人分類: Java web 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.
註冊帳號時郵箱驗證是怎麼實現的?
資料庫表設計: 賬號ID,郵箱,生成的隨機啟用Key,有效驗證時間 傳送郵件(SMTP協議之類,郵件格式為HTML), 附帶一個A標籤的連結地址: http://XXX.XXX.XXX/XXX.XXX?id=賬號ID&key=特定的Key 使用者點選連結,後端程式碼處理: 驗
賬號註冊郵箱啟用設計
我們在很多網站註冊會員時,註冊完成後,系統會自動向使用者的郵箱傳送一封郵件,這封郵件的內容就是一個URL連結,使用者需要點選開啟這個連結才能啟用之前在該網站註冊的帳號。啟用成功後才能正常使用會員功能。 註冊帳號、傳送啟用郵件、驗證啟用帳號、處理URL連結過期的功能。 業務流程: 1、
javaweb郵箱註冊賬號和啟用
先設計資料庫表 active代表是否啟用,如果沒有去郵箱點選連結,active為0,點了就更新active欄位為1 需要的jar包依賴 <dependency> <groupId>org.apache.commons</gro
java Web中實現QQ郵箱驗證以及驗證碼註冊使用者
實體類:User.java package com.yinhe.bean; import java.util.Date; public class User { private String uid; private String username; private Str
註冊kaggle後,郵箱驗證Confirm Signup失敗
從郵箱點選驗證郵件中的“Activate”按鈕,網頁來到Confirm Signup頁面,但是由於牆的原因看不到google的人機驗證,所以直接點選verify會失敗的。這裡給出的方法是利用谷歌訪問助手外掛。下載地址:h
小專案製作:javaWeb之郵箱驗證註冊(javaMail+jdbc+log4j)
功能設計: 架構設計: 註冊時通過傳送郵件方式,傳遞訪問專案啟用的servlet進行改寫資料庫中active的值,通過傳遞啟用碼acode來辨別資料庫中是否有該賬戶資訊 註冊功能實現: servlet: package cn.hncu.re
郵箱驗證功能原理 語法 屬性
tex ear priority 技術支持 ray 註冊 編碼 swe http 郵箱驗證功能原理 1 [已解決問題] 瀏覽: 3508次 很多地方都在註冊賬號的時候使用郵箱驗證功能。註冊後發送一封郵件到註冊郵箱裏面。然後點擊 郵箱裏面的鏈接 激活郵箱。 還有
Android中驗證輸入是否為漢字及手機號,郵箱驗證,IP地址可用port號驗證
bili repl ips gettext content 驗證 arr mat 數據 1,驗證是否為漢字 // 驗證昵稱 private boolean verifyNickname() { String nickname = edt_use
Java中郵箱驗證的正則表達式
pan stat bool string 表達 正則 match art pattern public static boolean checkEmail(String email) { String regex = "\\w+([-+.]\\w