java實(shí)現(xiàn)通過(guò)綁定郵箱找回密碼功能
本文實(shí)例為大家分享了java實(shí)現(xiàn)通過(guò)綁定郵箱找回密碼功能,供大家參考,具體內(nèi)容如下
1.輸入用戶名及驗(yàn)證碼,驗(yàn)證用戶名是否存在
(1).生成驗(yàn)證碼工具類
package com.utils; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.util.HashMap; import java.util.Map; import java.util.Random; /** * @Title: GraphicsUtil.java * @copyright * @Package com.utils * @Description: TODO(這里用一句話描述這個(gè)類的作用) * @author Mr.chen * @date 2016-11-2 下午03:31:30 */ public class GraphicsUtil { private Font mFont = new Font("Times New Roman", Font.PLAIN, 17); Color getRandColor(int fc,int bc){ Random random = new Random(); if(fc>255) fc=255; if(bc>255) bc=255; int r=fc+random.nextInt(bc-fc); int g=fc+random.nextInt(bc-fc); int b=fc+random.nextInt(bc-fc); return new Color(r,g,b); } public Map<String, Object> getGraphics(){ int width=100,height=18; BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); Graphics g=image.getGraphics(); Random random = new Random(); g.setColor(getRandColor(200,250)); g.fillRect(1, 1, width-1, height-1); g.setColor(new Color(102,102,102)); g.drawRect(0, 0, width-1, height-1); g.setFont(mFont); g.setColor(getRandColor(160,200)); //畫(huà)隨機(jī)線 for (int i=0;i<155;i++){ int x = random.nextInt(width - 1); int y = random.nextInt(height - 1); int xl = random.nextInt(6) + 1; int yl = random.nextInt(12) + 1; g.drawLine(x,y,x + xl,y + yl); } //從另一方向畫(huà)隨機(jī)線 for (int i = 0;i < 70;i++){ int x = random.nextInt(width - 1); int y = random.nextInt(height - 1); int xl = random.nextInt(12) + 1; int yl = random.nextInt(6) + 1; g.drawLine(x,y,x - xl,y - yl); } //生成隨機(jī)數(shù),并將隨機(jī)數(shù)字轉(zhuǎn)換為字母 String sRand=""; for (int i=0;i<6;i++){ int itmp = random.nextInt(26) + 65; char ctmp = (char)itmp; sRand += String.valueOf(ctmp); g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110))); g.drawString(String.valueOf(ctmp),15*i+10,16); } g.dispose(); Map<String, Object> map=new HashMap<String, Object>(); map.put("rand", sRand); map.put("image", image); return map; } }
(2).生成驗(yàn)證碼action
/** * @Description: 獲取驗(yàn)證碼 * @author Mr.chen * @date 2016-11-2 下午03:45:28 */ public void getCode(){ try { HttpServletResponse response = ServletActionContext.getResponse(); HttpServletRequest request= ServletActionContext.getRequest(); response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires", 0); //表明生成的響應(yīng)是圖片 response.setContentType("image/jpeg"); Map<String, Object> map=new GraphicsUtil().getGraphics(); System.out.println(map.get("rand")); request.getSession().setAttribute("rand", map.get("rand")); ImageIO.write((RenderedImage) map.get("image"), "JPEG", response.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } } (3).驗(yàn)證用戶名是否存在 /** * @Description: 檢查用戶名是否存在 * @author Mr.chen * @date 2016-11-2 下午04:49:02 */ public void checkUsernumber(){ try { HttpServletResponse response = ServletActionContext.getResponse(); HttpServletRequest request= ServletActionContext.getRequest(); String usernumber = request.getParameter("usernumber"); Studentinfo stu= studentinfoService.getStudentinfoByUsernumber(usernumber); response.setContentType("text/plain; charset=utf-8"); response.setCharacterEncoding("UTF-8"); if(stu==null){ response.getWriter().print("false"); }else{ if(!StringUtils.isBlank(stu.getEmail())){ response.getWriter().print("true"); }else{ response.getWriter().print("notEmail"); } } response.getWriter().flush(); response.getWriter().close(); } catch (IOException e) { e.printStackTrace(); } }
2.用戶名驗(yàn)證通過(guò)后往綁定郵箱發(fā)送郵件
/** * @Description: 發(fā)送郵件 * @author Mr.chen * @date 2016-11-2 下午05:06:24 */ @SuppressWarnings("static-access") public String toFindPassword2(){ HttpServletRequest request= ServletActionContext.getRequest(); String usernumber = request.getParameter("usernumber"); Studentinfo stu= studentinfoService.getStudentinfoByUsernumber(usernumber); try { Properties prop = new Properties(); prop.setProperty("mail.transport.protocol", "smtp"); prop.setProperty("mail.smtp.host", "smtp.qq.com"); prop.setProperty("mail.smtp.auth", "true"); prop.put("mail.smtp.port","587"); prop.setProperty("mail.debug", "true"); //驗(yàn)證寫(xiě)信者郵箱,此處使用第三方授權(quán)碼登陸,使用密碼不知道為什么登錄不上 Authenticator authenticator = new PopAuthenticator("123456789@qq.com", "**************"); //創(chuàng)建會(huì)話 Session session = Session.getInstance(prop,authenticator); //填寫(xiě)信封寫(xiě)信 Message msg = new MimeMessage(session); //設(shè)置發(fā)郵件的原地址 msg.setFrom(new InternetAddress("123456789@qq.com")); //設(shè)置接收人 msg.setRecipient(RecipientType.TO, new InternetAddress(stu.getEmail())); msg.setSubject("找回密碼!"); msg.setText(this.createLink(stu)); //驗(yàn)證用戶名密碼發(fā)送郵件 Transport transport = session.getTransport(); transport.send(msg); request.setAttribute("stu", stu); return SUCCESS; }catch(Exception e){ e.printStackTrace(); } return ERROR; }
/** * @Description: 生成郵箱鏈接地址 * @author Mr.chen * @date 2016-11-3 下午01:50:14 */ public String createLink(Studentinfo stu){ //生成密鑰 String secretKey=UUID.randomUUID().toString(); //設(shè)置過(guò)期時(shí)間 Date outDate = new Date(System.currentTimeMillis() + 30 * 60 * 1000);// 30分鐘后過(guò)期 System.out.println(System.currentTimeMillis()); long date = outDate.getTime() / 1000 * 1000;// 忽略毫秒數(shù) mySql 取出時(shí)間是忽略毫秒數(shù)的 //此處應(yīng)該更新Studentinfo表中的過(guò)期時(shí)間、密鑰信息 stu.setOutDate(date); stu.setValidataCode(secretKey); studentinfoService.updateStudentinfo(stu); //將用戶名、過(guò)期時(shí)間、密鑰生成鏈接密鑰 String key =stu.getUsernumber() + "$" + date + "$" + secretKey; String digitalSignature = MD5Util.getMd5(key);// 數(shù)字簽名 HttpServletRequest request= ServletActionContext.getRequest(); String path=request.getContextPath(); String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path; String resetPassHref = basePath + "/toFindPassword3.action?sid="+ digitalSignature +"&id="+stu.getId(); String emailContent = "請(qǐng)勿回復(fù)本郵件.點(diǎn)擊下面的鏈接,重設(shè)密碼,本郵件超過(guò)30分鐘,鏈接將會(huì)失效,需要重新申請(qǐng)找回密碼." + resetPassHref; return emailContent; }
3.郵件發(fā)送成功后進(jìn)入郵箱,通過(guò)該鏈接進(jìn)入修改密碼請(qǐng)求,鏈接驗(yàn)證通過(guò)后進(jìn)入修改密碼頁(yè)面
/** * @Description: 該方法用于處理從郵箱鏈接過(guò)來(lái)的修改密碼請(qǐng)求 * @author Mr.chen * @date 2016-11-3 下午02:24:17 */ public String toFindPassword3(){ String message=""; HttpServletRequest request= ServletActionContext.getRequest(); //獲取鏈接中的加密字符串 String sid=request.getParameter("sid"); //獲取鏈接中的用戶名 String id=request.getParameter("id"); if(StringUtils.isBlank(sid)||StringUtils.isBlank(id)){ System.out.println("請(qǐng)求的鏈接不正確,請(qǐng)重新操作."); message="請(qǐng)求的鏈接不正確,請(qǐng)重新操作."; } Studentinfo stu=studentinfoService.getStudentinfoById(Long.parseLong(id)); if(stu!=null){ //獲取當(dāng)前用戶申請(qǐng)找回密碼的過(guò)期時(shí)間 //找回密碼鏈接已經(jīng)過(guò)期 if(stu.getOutDate()<=System.currentTimeMillis()){ System.out.println("鏈接已經(jīng)過(guò)期"); message="鏈接已經(jīng)過(guò)期"; } //獲取當(dāng)前登陸人的加密碼 String key = stu.getUsernumber()+"$"+stu.getOutDate()/1000*1000+"$"+stu.getValidataCode();//數(shù)字簽名 String digitalSignature = MD5Util.getMd5(key);// 數(shù)字簽名 if(!digitalSignature.equals(sid)){ System.out.println("鏈接加密密碼不正確"); message="鏈接加密密碼不正確"; }else{ //驗(yàn)證成功,跳入到修改密碼界面 request.setAttribute("stu", stu); } }else{ System.out.println("用戶信息不存在"); message="用戶信息不存在"; request.setAttribute("message", message); } return SUCCESS; }
4.輸入新密碼,驗(yàn)證成功后即修改成功
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java正則表達(dá)式之Pattern和Matcher的使用
本文詳細(xì)介紹了Java中處理正則表達(dá)式的Pattern和Matcher類的使用方法和實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09Springboot整合JwtHelper實(shí)現(xiàn)非對(duì)稱加密
本文主要介紹了Springboot整合JwtHelper實(shí)現(xiàn)非對(duì)稱加密,主要介紹兩種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03JAVA下單接口優(yōu)化實(shí)戰(zhàn)TPS性能提高10倍
今天小編就為大家分享一篇關(guān)于JAVA下單接口優(yōu)化實(shí)戰(zhàn)TPS性能提高10倍,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12idea設(shè)置@Author文件頭注釋的實(shí)現(xiàn)步驟
本文主要介紹了idea設(shè)置@Author文件頭注釋的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07