摘要:昨晚準備第一時間寫一篇郵箱驗證,但是由于加班太晚整個人都是暈暈乎乎的就沒有寫這一篇文章。
昨晚準備第一時間寫一篇Java郵箱驗證,但是由于加班太晚整個人都是暈暈乎乎的就沒有寫這一篇文章。
在生活中,郵箱驗證已經不是什么新鮮事,其實萬變不離其宗,它的原理就是注冊成功后,生成一個token,然后發送給用戶帶有token的url,然后服務器端根據判斷激活是否超時、token是否合法、用戶是否已經激活過等操作,對于筆者今天寫的這個項目,只是簡單的完成驗證,更多的操作需要后期去不斷完成以及優化,項目搭建運用了《Maven多模塊項目搭建》,項目已經上傳到Github:項目地址
Begin正題:
一、 前端界面搭建
前端的話沒有使用Bootstrap,使用了Google家的materialize(http://materializecss.com/),雖然簡單的界面卻變成了Android風格,運用起來比較方便,效果方面優于Boostrap。
注冊
當消息為空的提示
二、后端開發
1、SMTP協議
SMTP的全稱是“Simple Mail Transfer Protocol”,即簡單郵件傳輸協議,在該郵箱驗證項目中因為只涉及到郵箱的發送和接受,所以使用SMTP協議
2、搭建SendEmail.java
該Java類對郵件發送進行了封裝,首先需要添加JavaMail的依賴
依賴:
javax.mail 1.4
項目代碼:
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,之前看過一些博客,但是里面都沒有涉及到這個問題,解決方案如下:
首先需要開啟電子郵箱協議服務:
重點我已經用箭頭標注在圖片中->授權碼
授權碼就是第三方登錄時用到的認證密碼
3、注冊信息提交
項目代碼:
Controller層
第一步,需要判斷需要注冊的郵箱地址是否存在,如果存在就返回1,拒絕用戶提交該郵箱地址,運用前端ajax請求
@PostMapping("/jsonSelectUser.do") @ResponseBody public MapselectUserByEmail(@RequestParam("email") String email){ User user = webService.selectUserByEmail(email); Map map = new HashMap<>(); if(user==null){ map.put("state", 0); }else{ map.put("state", 1); } return map; }
第二步,若郵箱地址不存在,就允許用戶提交信息
@PostMapping("/insertUser.do") @ResponseBody public MapinsertUser(@RequestParam("email") String email, @RequestParam("password") String password) throws Exception { Map map = new HashMap (); 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依賴:
commons-codec commons-codec 1.10
/* * 添加用戶信息 */ @Transactional public int insertUser(String email, String password) throws Exception { int num = userMapper.insertUser(email,doPassword(password),doCode(email, password)); String context="尊敬的"+email+"用戶:
感謝您注冊我們的網站,但是注冊之后需要你繼續完成用戶激活:"+URL+"register.do?code="+doCode(email, password)+"&email="+email+"
"; //發送郵件操作 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 into user(email,password,code) values(#{email},#{password},#{code})
添加完成跳轉到信息列表:
用戶接收到信息:
4、郵件發送與驗證
郵箱驗證,首先需驗證郵箱地址和唯一標識是否為用戶偽造,若是偽造:
若正確:
數據庫中用戶信息也會進行改變,注冊成功并沒有激活:
注冊成功并激活成功:
列表界面也會改變:
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 user set code="",state=1 where email=#{email}
基本的郵箱驗證已經完成,其余的功能以及數據安全處理后面不斷地完善,如果有不足的地方,還請大家多多指教,筆者很喜歡結交一些程序員朋友,大家可以加微信一起交流
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67992.html
摘要:目前該功能并未完善,敬請期待。反正每次都會有新的東西補充上去一開始我本來想做的是可以使用微信登陸,也可以使用賬戶郵箱登陸,也可以使用短信登陸的。后來發現微信登陸要企業認證,做不了。 從零開發項目概述 最近這一直在復習數據結構和算法,也就是前面發出去的排序算法八大基礎排序總結,Java實現單向鏈表,棧和隊列就是這么簡單,十道簡單算法題等等... 被虐得不要不要的,即使是非常簡單有時候繞半...
摘要:剛下載時項目中使用后得不到某寶的數據,因為數據是動態生成的。使用去獲取數據某寶的取不到用某度的首頁試了下是可以的。我是根據店鋪名稱賣家地區中包含特定關鍵字來過濾的。把寶貝列表的做為輸入循環寶貝列表并進入抓取交易量數據并保存。 項目背景 因前段時間公司有需求,想得到我們公司所在地區(四線城市)的電商企業的銷售額排名情況,時間緊急,調研無 果,花費RMB若干買了某工具的數據服務(避...
摘要:時間年月日星期三說明本文部分內容均來自慕課網。用戶過生日,系統發送生日祝福郵件。將最新活動和優惠以郵件的形式告知會員。通常把處理用戶請求郵件發送請求的郵件服務器稱為服務器。提供了加密的協議被稱為。 時間:2017年06月07日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學示例源碼:無個人學習源碼:https://github.com/zcc...
摘要:文件項目隸屬的實際項目名實際項目中的一個項目模塊名稱版本號當前項目打包的方式,默認為以上的配置會獲得一個格式的包用于定義構建輸出的一些附屬的構建。 pom.xml文件 org.son.nexus//項目隸屬的實際項目名 nexus-indexer//實際項目中的一個maven項目模塊名稱 2.0.0//版本號 jar//當前maven項目打包的方式,默認為jar 以上的配置會獲得一個-...
閱讀 1639·2021-09-02 09:55
閱讀 1105·2019-08-30 13:19
閱讀 1402·2019-08-26 13:51
閱讀 1450·2019-08-26 13:49
閱讀 2378·2019-08-26 12:13
閱讀 459·2019-08-26 11:52
閱讀 1904·2019-08-26 10:58
閱讀 3087·2019-08-26 10:19