最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)注冊郵箱激活賬戶實(shí)例代碼

 更新時(shí)間:2017年07月25日 09:33:47   作者:阿木俠  
本篇文章主要介紹了Java實(shí)現(xiàn)郵箱激活賬戶實(shí)例代碼,這里整理了詳細(xì)的代碼,具有一定的參考價(jià)值,有需要的小伙伴可以參考下。

在網(wǎng)站注冊時(shí)一般都會(huì)要驗(yàn)證注冊用戶身份的合法性,通常的做法是提供手機(jī)號(hào)驗(yàn)證或者郵箱驗(yàn)證。

手機(jī)驗(yàn)證:填寫手機(jī)號(hào)碼,點(diǎn)擊發(fā)送驗(yàn)證碼,接收后填寫驗(yàn)證碼比對,無誤后注冊成功。

郵箱驗(yàn)證:注冊時(shí)填寫郵箱賬號(hào),點(diǎn)擊注冊,網(wǎng)站郵箱會(huì)給該郵箱發(fā)送一封激活郵件,用戶點(diǎn)擊后激活該賬號(hào)。

這里通過實(shí)例來介紹一下郵箱驗(yàn)證的實(shí)現(xiàn)過程,例子可以運(yùn)行,暫時(shí)沒有發(fā)現(xiàn)什么問題,不過也可能有不安全的地方,歡迎大家指正。

實(shí)現(xiàn)思路

注冊時(shí)填寫郵箱,點(diǎn)擊注冊時(shí)網(wǎng)站系統(tǒng)郵箱發(fā)送激活驗(yàn)證鏈接到此郵箱,用戶來激活賬戶

點(diǎn)擊注冊,系統(tǒng)郵箱會(huì)發(fā)送一封激活郵件到你填寫的郵箱賬號(hào)中

在沒有進(jìn)行激活操作前,設(shè)定某個(gè)字段狀態(tài)是0,表示此賬號(hào)未激活,不可以使用或者某些功能受限

激活操作之后,將activated字段更新為1,這樣就完成了激活操作

那么這里還有一個(gè)codeUrl字段,他的作用是存入一個(gè)唯一標(biāo)識(shí)的隨機(jī)碼,這個(gè)隨機(jī)碼由用戶名和UUID唯一標(biāo)識(shí)的隨機(jī)數(shù)組成,這樣做的目的是防止用戶使用不存在的郵箱又修改鏈接中的參數(shù)來激活賬戶,將鏈接中的隨機(jī)碼和數(shù)據(jù)庫中的比對,來達(dá)到相對安全的激活。

下面是具體的代碼

首先是注冊的servlet,這里主要測試激活賬號(hào)的功能,注冊代碼有點(diǎn)low,不安全,將就看一下

package org.amuxia.emailtest.servlet; 
 
import java.io.IOException; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.UUID; 
 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
import org.amuxia.emailtest.pojo.User; 
import org.amuxia.emailtest.utils.EmailUtils; 
import org.amuxia.emailtest.utils.MyJDBC; 
 
/** 
 * @author amuxia 
 * 2017年7月24日 
 */ 
@WebServlet("/RegistServlet") 
public class RegistServlet extends HttpServlet { 
 private static final long serialVersionUID = 1L; 
 
 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
  String username = request.getParameter("username"); 
  String password = request.getParameter("password"); 
  String email = request.getParameter("email"); 
  String codeUrl = UUID.randomUUID().toString(); 
  User user = new User(); 
  user.setUsername(username); 
  user.setPassword(password); 
  user.setEmail(email); 
  user.setActivated(false); //剛注冊默認(rèn)是沒有激活狀態(tài) 
  String SQL = "insert into tb_user(username,password,email,activated,codeUrl) value (?,?,?,?,?) "; 
  MyJDBC.insert(SQL, false, username,password,email,0,codeUrl);//注冊信息插入數(shù)據(jù)庫 
  String querySQL = "select * from tb_user where email=?"; 
  ResultSet rs = MyJDBC.query(querySQL, email); 
  try { 
   if(rs.next()){ 
    user.setId(rs.getInt(1)); 
   } 
  } catch (SQLException e) { 
   // TODO Auto-generated catch block 
   e.printStackTrace(); 
  } 
   
  // 注冊成功后,發(fā)送帳戶激活鏈接 
  request.getSession().setAttribute("user", user); 
  EmailUtils.sendAccountActivateEmail(user); 
  request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request,response); 
 } 
 
} 

激活賬號(hào)的Servlet,也就是更新操作

package org.amuxia.emailtest.servlet; 
 
import java.io.IOException; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
import org.amuxia.emailtest.pojo.User; 
import org.amuxia.emailtest.utils.GenerateLinkUtils; 
import org.amuxia.emailtest.utils.MyJDBC; 
 
/** 
 * @author amuxia 
 * 2017年7月24日 
 */ 
@WebServlet("/ActivateServlet") 
public class ActivateServlet extends HttpServlet{ 
 private static final long serialVersionUID = 1L; 
@Override 
protected void service(HttpServletRequest request, HttpServletResponse response) 
  throws ServletException, IOException { 
 // TODO Auto-generated method stub 
 String idValue = request.getParameter("id"); 
 System.out.println(idValue); 
 int id = -1; 
 try { 
  id = Integer.parseInt(idValue); 
 } catch (NumberFormatException e) { 
  e.printStackTrace(); 
 } 
 String SQL = "select * from tb_user where id=?"; 
 ResultSet rs= MyJDBC.query(SQL, id); 
 User user = new User(); 
 try { 
  if(rs.next()){ 
   user.setId(rs.getInt(1)); 
   user.setUsername(rs.getString(2)); 
   user.setPassword(rs.getString(3)); 
   user.setEmail(rs.getString(4)); 
   user.setActivated(rs.getBoolean(5)); 
   user.setCodeUrl(rs.getString(6)); 
  } 
 } catch (SQLException e) { 
  // TODO Auto-generated catch block 
  e.printStackTrace(); 
 } 
 //驗(yàn)證無誤,狀態(tài)更改為1,即激活 
 if(GenerateLinkUtils.verifyCheckcode(user, request)){ 
  String updSQL = "update tb_user set activated =1 where id=?"; 
  MyJDBC.execute(updSQL, id); 
  user.setActivated(true); 
  request.getSession().setAttribute("user", user); 
  request.getRequestDispatcher("/WEB-INF/jsp/pass.jsp").forward(request, response); 
 } 
 } 
} 

發(fā)送Email的工具類

package org.amuxia.emailtest.utils; 
 
import java.util.Date; 
import java.util.Properties; 
 
import javax.mail.Authenticator; 
import javax.mail.Message.RecipientType; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 
 
import org.amuxia.emailtest.pojo.User; 
 
/** 
 * @author amuxia 
 * 2017年7月24日 
 */ 
public class EmailUtils { 
  
 private static final String FROM = "要發(fā)送郵件的郵箱,這個(gè)例子是163郵箱"; 
 
 public static void sendAccountActivateEmail(User user) { 
  Session session = getSession(); 
  MimeMessage message = new MimeMessage(session); 
  try { 
   message.setSubject("這是一封激活賬號(hào)的郵件,復(fù)制鏈接到地址欄來激活他"); 
   message.setSentDate(new Date()); 
   message.setFrom(new InternetAddress(FROM)); 
   message.setRecipient(RecipientType.TO, new InternetAddress(user.getEmail())); 
   message.setContent("<a target='_BLANK' href=''>"+GenerateLinkUtils.generateActivateLink(user)+"</a>","text/html;charset=utf-8"); 
   Transport.send(message); 
  } catch (Exception e) { 
   e.printStackTrace(); 
  } 
 } 
 
  
 public static Session getSession() { 
  Properties props = new Properties(); 
  props.setProperty("mail.transport.protocol", "smtp"); 
  props.setProperty("mail.smtp.host", "smtp.163.com"); 
  props.setProperty("mail.smtp.port", "25"); 
  props.setProperty("mail.smtp.auth", "true"); 
  Session session = Session.getInstance(props, new Authenticator() { 
   @Override 
   protected PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(FROM, "上面郵箱的密碼"); 
   } 
    
  }); 
  return session; 
 } 
} 

這里需要注意一下,以上例子配置的是163郵箱,需要進(jìn)行郵箱客戶端的授權(quán),授權(quán)之后,網(wǎng)易郵箱會(huì)發(fā)來一份客戶端授權(quán)碼作為替代郵箱密碼,代碼里填寫的密碼其實(shí)是授權(quán)碼,配置好郵箱最好發(fā)一份郵件測試一下,有時(shí)程序出問題很可能是郵箱客戶端根本發(fā)不了郵件

加密賬戶激活鏈接生成的工具類

package org.amuxia.emailtest.utils; 
 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
 
import javax.servlet.ServletRequest; 
 
import org.amuxia.emailtest.pojo.User; 
 
/** 
 * @author amuxia 
 * 2017年7月24日 
 */ 
public class GenerateLinkUtils { 
  
 private static final String CHECK_CODE = "checkCode"; 
  
 public static String generateActivateLink(User user) { 
  return "http://localhost/EmailDemo/ActivateServlet?id=" 
    + user.getId() + "&" + CHECK_CODE + "=" + generateCheckcode(user); 
 } 
  
  
 /** 
  * 生成校驗(yàn)碼,用戶名+UUID唯一標(biāo)識(shí)符,為安全把他們加密發(fā)送 
  * @param user 
  * @return 
  */ 
 public static String generateCheckcode(User user) { 
  String userName = user.getUsername(); 
  String randomCode = user.getCodeUrl(); 
  return md5(userName + ":" + randomCode); 
 } 
 
  
 /** 
  * 接收回來的校驗(yàn)碼和發(fā)送出去的是不是同一份 
  * @param user 
  * @param request 
  * @return 
  */ 
 public static boolean verifyCheckcode(User user,ServletRequest request) { 
  String checkCode = request.getParameter(CHECK_CODE); 
  System.out.println(generateCheckcode(user).equals(checkCode)); 
  return true; 
 } 
 
 private static String md5(String string) { 
  MessageDigest md = null; 
  try { 
   md = MessageDigest.getInstance("md5"); 
   md.update(string.getBytes()); 
   byte[] md5Bytes = md.digest(); 
   return bytes2Hex(md5Bytes); 
  } catch (NoSuchAlgorithmException e) { 
   e.printStackTrace(); 
   System.out.println("md5這里出錯(cuò)了"); 
  } 
   
  return null; 
 } 
  
 private static String bytes2Hex(byte[] byteArray) 
 { 
  StringBuffer strBuf = new StringBuffer(); 
  for (int i = 0; i < byteArray.length; i++) 
  { 
   if(byteArray[i] >= 0 && byteArray[i] < 16) 
   { 
    strBuf.append("0"); 
   } 
   strBuf.append(Integer.toHexString(byteArray[i] & 0xFF)); 
  } 
  return strBuf.toString(); 
 } 
 
} 

還有一個(gè)操作數(shù)據(jù)庫的封裝類,MyJDBC,前面博客有寫,代碼挺長,就不貼了,這是鏈接:

http://m.fzitv.net/article/70107.htm

http://m.fzitv.net/article/88647.htm

實(shí)體類User

package org.amuxia.emailtest.pojo; 
 
public class User { 
 private int id; 
 private String username; 
 private String password; 
 private String email; 
 private boolean activated;//賬號(hào)狀態(tài) 
 private String codeUrl;//激活鏈接中的隨機(jī)碼 
  
 public int getId() { 
  return id; 
 } 
 public void setId(int id) { 
  this.id = id; 
 } 
 public String getUsername() { 
  return username; 
 } 
 public void setUsername(String username) { 
  this.username = username; 
 } 
 public String getPassword() { 
  return password; 
 } 
 public void setPassword(String password) { 
  this.password = password; 
 } 
 public String getEmail() { 
  return email; 
 } 
 public void setEmail(String email) { 
  this.email = email; 
 } 
 
 public boolean isActivated() { 
  return activated; 
 } 
 public void setActivated(boolean activated) { 
  this.activated = activated; 
 } 
 public String getCodeUrl() { 
  return codeUrl; 
 } 
 public void setCodeUrl(String codeUrl) { 
  this.codeUrl = codeUrl; 
 } 
 public User() { 
  super(); 
   
 } 
  
} 

注冊的jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
 
<title>注冊</title> 
</head> 
 
<body> 
 <form action="/EmailDemo/RegistServlet" method="post"> 
  用戶名:<input type="text" name="username"><br/> 
  密碼:<input type="password" name="password"><br/> 
  郵箱:<input type="text" name="email"><br/> 
  <input type="submit" value="注冊"> 
 </form> 
</body> 
</html> 

用到的包?

郵箱驗(yàn)證的大概功能就完成了,但是還有很多不足之處,貌似應(yīng)該設(shè)置一個(gè)過期時(shí)間。等等。。。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java通過try釋放資源的方法

    Java通過try釋放資源的方法

    這篇文章主要介紹了Java通過try釋放資源的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 通過Maven下載依賴Jar包的流程分享

    通過Maven下載依賴Jar包的流程分享

    本文主要介紹了Maven下載依賴Jar包的詳細(xì)流程,包括輸入Maven倉庫的官方地址、搜索依賴Jar包、選擇版本、復(fù)制和粘貼Maven依賴到pom文件中下載依賴Jar包
    2025-02-02
  • java類型生命周期的詳細(xì)解析

    java類型生命周期的詳細(xì)解析

    以下是對java中的類型生命周期進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • SpringBoot中的多RabbitMQ數(shù)據(jù)源配置實(shí)現(xiàn)

    SpringBoot中的多RabbitMQ數(shù)據(jù)源配置實(shí)現(xiàn)

    本篇博客將介紹如何在 Spring Boot 中配置和管理多個(gè) RabbitMQ 數(shù)據(jù)源,以滿足不同的應(yīng)用需求,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • RestTemplate自定義ErrorHandler方式

    RestTemplate自定義ErrorHandler方式

    這篇文章主要介紹了RestTemplate自定義ErrorHandler方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 解決SpringBoot多模塊發(fā)布時(shí)99%的問題

    解決SpringBoot多模塊發(fā)布時(shí)99%的問題

    本文歸納了以下 8 個(gè)原則和發(fā)布時(shí)經(jīng)常出現(xiàn)的 4 個(gè)問題的解決方案,掌握了這些原則和解決方案,幾乎可以解決絕大數(shù)SpringBoot發(fā)布問題
    2019-07-07
  • Java限流實(shí)現(xiàn)的幾種方法詳解

    Java限流實(shí)現(xiàn)的幾種方法詳解

    這篇文章主要介紹了Java限流實(shí)現(xiàn)的幾種方法,通俗的說,限流就是 限制一段時(shí)間內(nèi),用戶訪問資源的次數(shù),減輕服務(wù)器壓力,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-12-12
  • 解決IntelliJ?IDEA輸出中文顯示為問號(hào)問題的有效方法

    解決IntelliJ?IDEA輸出中文顯示為問號(hào)問題的有效方法

    最近剛學(xué)到文件字節(jié)流這里,但輸出中文時(shí),出現(xiàn)了控制臺(tái)輸出問號(hào)的情況,所以下面這篇文章主要給大家介紹了關(guān)于如何解決IntelliJ?IDEA輸出中文顯示為問號(hào)問題的有效方法,需要的朋友可以參考下
    2022-07-07
  • 使用hutool工具進(jìn)行導(dǎo)入導(dǎo)出excel表格

    使用hutool工具進(jìn)行導(dǎo)入導(dǎo)出excel表格

    如何在后臺(tái)添加導(dǎo)入導(dǎo)出表格的功能呢,本期的文章將會(huì)帶領(lǐng)小伙伴們一起實(shí)現(xiàn)此功能,文中有詳細(xì)的代碼示例和圖文介紹,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-10-10
  • java中類之間的數(shù)據(jù)傳遞方式

    java中類之間的數(shù)據(jù)傳遞方式

    這篇文章主要介紹了java中類之間的數(shù)據(jù)傳遞方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

辛集市| 贡嘎县| 花莲县| 双峰县| 柘荣县| 陵川县| 九龙县| 安图县| 道孚县| 原平市| 杭锦后旗| 乐至县| 玛沁县| 萝北县| 玉门市| 辽中县| 鄂伦春自治旗| 辉南县| 宝清县| 临汾市| 平遥县| 辽中县| 台南市| 牟定县| 阿尔山市| 文安县| 南充市| 迁西县| 蒲城县| 龙南县| 深水埗区| 百色市| 洛宁县| 昌图县| 和政县| 平陆县| 萝北县| 大竹县| 丽江市| 米泉市| 哈密市|