java實現郵箱註冊驗證
在日常生活中,我們在一個網站中註冊一個賬戶時,往往在提交個人資訊後,網站還要我們通過手機或郵件來驗證,郵件的話大概會是下面這個樣子的:
使用者通過點選連結從而完成註冊,然後才能登入。
也許你會想,為什麼要這麼麻煩直接提交註冊不就行了嗎?這其中很大一部分原因是為了防止惡意註冊。接下來讓我們一起來使用最簡單的JSP+Servlet的方式來完成一個通過郵箱驗證註冊的小案例吧。
準備工作
前提知識
動手實踐之前,你最好對以下知識有所瞭解:
- JSP和Servlet
- Maven
- MySQL
- c3p0
如果對郵件收發過程完全不瞭解的話,可以花三分鐘的時間到慕課網瞭解一下,講得算是非常清楚了,這裡就不贅述了。放張圖回憶一下:
郵箱準備
在瞭解的上述內容之後,要實現這個案例,首先我們還得有兩個郵箱賬號,一個用來發送郵件,一個用來接收郵件。本案例使用QQ郵箱向163郵箱傳送啟用郵件,因此需要登入QQ郵箱,在設定->賬戶面板中開啟POP3/SMTP服務,以允許我們通過第三方客戶端傳送郵件:
還要注意的是,登入以下服務: POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務時,需要用到授權碼而不是QQ密碼,授權碼是用於登入第三方郵件客戶端的專用密碼。因此我們需要獲得授權碼,以在後面的程式中使用。
好了,到此準備工作就差不多了,下面開始動手吧。
實現註冊Demo
建立Maven工程
本次案例基於Maven,因此你要先建立一個Maven的Web工程,並引入相關依賴:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
建立資料庫表
接下來使用MySQL建立一張簡單的使用者表:
1 2 3 4 5 6 7 8 |
|
其中要注意的地方是state欄位(用來判斷使用者賬號是否啟用)和code欄位(啟用碼)。
建立註冊頁面
使用JSP建立一個最簡單的註冊頁面(請自行忽略介面):
嗯,果然夠簡單。
主要的業務邏輯
先想一下,我們的整個流程應該是這樣的:
- 使用者填寫相關資訊,點選註冊按鈕
- 系統先將使用者記錄儲存到資料庫中,其中使用者狀態為未啟用
- 系統傳送一封郵件並通知使用者去驗證
- 使用者登入郵箱並點選啟用連結
- 系統將使用者狀態更改為已啟用並通知使用者註冊成功
搞清楚了整個流程,實現起來應該就不難了。下圖是我建立的包結構:
ps:完整程式碼請見後文連結,這裡只討論主要的思路
首先是,使用者提交註冊資訊後,相應的servlet會將相關資訊傳給service層去處理,在service中需要做的就是講記錄儲存到資料庫中(呼叫dao層),然後再給使用者傳送一封郵件,UserServiceImpl相關程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
需要注意的是,應該新建一個執行緒去執行傳送郵件的任務,不然被罵估計是免不了了。 資料庫的操作比較簡單,此處就不貼出來了,無非是將使用者記錄插到資料庫中。值得一提的是,此處使用c3p0來作為資料來源來替代DriverManager,在頻繁獲取釋放資料庫連線時效率會大大提高,c3p0最簡單的配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
提供一個工具類DBUtil以獲取,釋放連線:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
要特別注意的一點是:即使是使用連線池,使用完Connection後呼叫close方法,當然這不意味著關閉與資料庫的TCP 連線,而是將連線還回到池中去,如果不close掉的話,這個連線將會一直被佔用,直到連線池中的連線耗盡為止。
使用JavaMail傳送郵件
使用JavaMail傳送郵件非常簡單,也是三步曲:
- 建立連線物件javax.mail.Session
- 建立郵件物件 javax.mail.Message
- 傳送郵件
直接看程式碼,詳細的註釋在程式碼中,MailUtil程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
|
ps:需要把上面的賬號、授權碼進行相應修改。
完成後,再有使用者提交註冊資訊時,應該就能收到驗證郵件了:
使用者點選連結後,我們要做的工作就是根據code(可以利用UUID生成)更改資料庫中相應使用者的狀態,然後提示使用者註冊結果了。
總結
簡單介紹瞭如何使用JavaMail完成了一個帶郵箱驗證的註冊案例,當然在實際開發中還有許多細節要注意,例如對使用者提交資訊的校驗,密碼進行加密等,此處的簡單案例並未詳盡處理這些細節。
注:想要讓別人能夠成功的完成註冊,需要提供一個公網ip,替換掉localhost