昨晚準備第一時間寫一篇Java郵箱驗證,可是因爲加班太晚整我的都是暈暈乎乎的就沒有寫這一篇文章。
在生活中,郵箱驗證已經不是什麼新鮮事,其實萬變不離其宗,它的原理就是註冊成功後,生成一個token,而後發送給用戶帶有token的url,而後服務器端根據判斷激活是否超時、token是否合法、用戶是否已經激活過等操做,對於筆者今天寫的這個項目,只是簡單的完成驗證,更多的操做須要後期去不斷完成以及優化,項目搭建運用了《Maven多模塊項目搭建》,項目已經上傳到Github:項目地址
Begin正題:css
1、 前端界面搭建html
前端的話沒有使用Bootstrap,使用了Google家的materialize(http://materializecss.com/),雖然簡單的界面卻變成了Android風格,運用起來比較方便,效果方面優於Boostrap。前端
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>註冊</title> </head> <link href="css/materialize.min.css" rel="stylesheet" type="text/css" /> <script src="js/jquery-2.1.0.js"></script> <style> .box { margin-top: 200px; } </style> <body> <div class="container box"> <div class="row valign-wrapper"> <div class="col l4 offset-l4"> <div class="row"> <div class="input-field"> <input id="email" type="email" class="validate"> <label for="email" data-error="error" data-success="success">郵件</label> </div> <div class="input-field"> <input id="password" type="password" class="validate"> <label for="password">密碼</label> </div> <div class="input-field center-align"> <a class="btn waves-effect waves-light" id="btn">註冊</a> </div> </div> </div> </div> </div> </body> <script src="js/materialize.min.js"></script> <script src="js/index.js"></script> <script> jQuery(function($) { $("#email").change(function(){ var email = $("#email").val(); submit_email(email); }) $("#btn").click(function() { var email = $("#email").val(); var password = $("#password").val(); if(email=="" || password==""){ Materialize.toast('信息不能爲空', 3000, 'rounded'); return false; }else{ submit(email,password); } }) }) </script> </html>
當消息爲空的提示java
2、後端開發jquery
一、SMTP協議git
SMTP的全稱是「Simple Mail Transfer Protocol」,即簡單郵件傳輸協議,在該郵箱驗證項目中由於只涉及到郵箱的發送和接受,因此使用SMTP協議程序員
二、搭建SendEmail.javagithub
該Java類對郵件發送進行了封裝,首先須要添加JavaMail的依賴web
依賴:ajax
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4</version> </dependency>
項目代碼:
public class SendEmail { private final static String FROM_EMAIL = "yangzinan127@163.com"; private final static String HOST = "smtp.163.com"; private final static String PASSWORD = "************"; private final static String SMTP = "smtp"; private static Properties properties = new Properties(); private static Session session; public static void sendMail(String to, String title, String context) throws Exception { properties.setProperty("mail.transport.protocol", "smtp");//電子郵箱協議 properties.setProperty("mail.smtp.host", HOST); //郵箱服務器地址 properties.setProperty("mail.smtp.auth", "true"); session = Session.getInstance(properties); session.setDebug(true);//開啓調試模式,能夠追蹤到郵件發送過程 MimeMessage mimeMessage = new MimeMessage(session); mimeMessage.setSubject(title);//標題 mimeMessage.setContent(context, "text/html;charset=utf-8");//內容 mimeMessage.setFrom(new InternetAddress(FROM_EMAIL));//發送人 mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(to));//收件人 mimeMessage.setSentDate(new Date());//發送時間 mimeMessage.saveChanges();//保存修改 Transport transport = session.getTransport(SMTP); transport.connect(FROM_EMAIL, PASSWORD); transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients()); transport.close(); } }
若是你寫過郵件發送,你就會發現這個代碼會有一個問題transport.connect(FROM_EMAIL, PASSWORD);
,問題其實就在PASSWORD上,其實這個並非電子郵箱登陸密碼,若是你寫了登陸密碼,系統將會拋出認證失敗yi'chang,以前看過一些博客,可是裏面都沒有涉及到這個問題,解決方案以下:
首先須要開啓電子郵箱協議服務:
重點我已經用箭頭標註在圖片中->受權碼
受權碼就是第三方登陸時用到的認證密碼
三、註冊信息提交
項目代碼:
Controller層
第一步,須要判斷須要註冊的郵箱地址是否存在,若是存在就返回1,拒絕用戶提交該郵箱地址,運用前端ajax請求
@PostMapping("/jsonSelectUser.do") @ResponseBody public Map<String,Integer> selectUserByEmail(@RequestParam("email") String email){ User user = webService.selectUserByEmail(email); Map<String,Integer> map = new HashMap<>(); if(user==null){ map.put("state", 0); }else{ map.put("state", 1); } return map; }
第二步,若郵箱地址不存在,就容許用戶提交信息
@PostMapping("/insertUser.do") @ResponseBody public Map<String, Object> insertUser(@RequestParam("email") String email, @RequestParam("password") String password) throws Exception { Map<String, Object> map = new HashMap<String, Object>(); int code = webService.insertUser(email, password); if (code > 0) { map.put("code", SUCCESS_CODE); map.put("message", "添加成功"); return map; } else { map.put("code", ERROR_CODE); map.put("message", "添加失敗"); return map; } }
用戶信息提交的流程是Controller->Service->Dao->Mapper.xml->DB
Service層
須要對控制層傳輸過來的密碼進行MD5加密,而後生成code(用戶惟一標識)
MD5依賴:
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.10</version> </dependency>
/* * 添加用戶信息 */ @Transactional public int insertUser(String email, String password) throws Exception { int num = userMapper.insertUser(email,doPassword(password),doCode(email, password)); String context="<p>尊敬的"+email+"用戶:</p><p style=text-indent:2em>感謝您註冊咱們的網站,可是註冊以後須要你繼續完成用戶激活:<a href="+URL+"register.do?code="+doCode(email, password)+"&email="+email+">"+URL+"register.do?code="+doCode(email, password)+"&email="+email+"</a></p>"; //發送郵件操做 sendMail(email, "用戶激活驗證",context); return num; }
用戶密碼加密:
/* * 密碼加密 */ public static String doPassword(String password) { String password_md5 = DigestUtils.md5Hex(password); return password_md5; }
用戶惟一標識生成:
/* * 生成code */ public static String doCode(String email, String password) { String code = DigestUtils.md5Hex(email + password); return code; }
Dao層
持久化層:
int insertUser(@Param("email") String email,@Param("password") String doPassword,@Param("code") String doCode); User selectUserByEmail(@Param("email") String email);
Mapper.xml
<insert id="insertUser"> insert into user(email,password,code) values(#{email},#{password},#{code}) </insert> <select id="selectUserByEmail" resultType="com.web.pojo.User"> select * from user where email=#{email} </select> <select id="selectUserList" resultType="com.web.pojo.User"> select * from user </select>
添加完成跳轉到信息列表:
用戶接收到信息:
四、郵件發送與驗證
郵箱驗證,首先需驗證郵箱地址和惟一標識是否爲用戶僞造,如果僞造:
若正確:
數據庫中用戶信息也會進行改變,註冊成功並無激活:
註冊成功並激活成功:
列表界面也會改變:
Controller層
項目代碼:
@GetMapping("/register.do") public String register(@RequestParam("code") String code, @RequestParam("email") String email) { User user = webService.selectUserByEmail(email); if (user!=null) { if((user.getCode()).equals(code) && user.getState()==0){ int num = webService.updateUserState(email); return "success"; }else{ return "error"; } } else { return "error"; } }
Service層
@Transactional public int updateUserState(String email) { int num = userMapper.updateUserState(email); return num; }
Dao層
int updateUserState(@Param("email") String email);
Mapper.xml層
<update id="updateUserState"> update user set code="",state=1 where email=#{email} </update>
基本的郵箱驗證已經完成,其他的功能以及數據安全處理後面不斷地完善,若是有不足的地方,還請你們多多指教,筆者很喜歡結交一些程序員朋友,你們能夠加微信一塊兒交流