首先說下思路:
用戶填寫自己的郵箱-->後臺驗證郵箱是否與ID相符合
--符合--> 利用javamail向用戶郵箱中發送一個找回密碼鏈接【url?id=XXX + validkey=XXX 其中validkey是MD5加密的字符串,包括用戶id,過期時間,隨機數】-->用戶填寫新密碼後保存至數據庫
--不符合--> 提示返回
其次說下數據庫設計(必備屬性設計):
下面來說下代碼實現:
pojo層:Admin.java
@Entity
@Table(name = "admin")
public class Admin {
private int id;
private String useraccount;
private String userpass;
private String useremail;
private Timestamp outdate;
private String signature;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "useraccount")
public String getUseraccount() {
return useraccount;
}
public void setUseraccount(String useraccount) {
this.useraccount = useraccount;
}
@Column(name = "userpass")
public String getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
this.userpass = userpass;
}
@Column(name = "useremail")
public String getUseremail() {
return useremail;
}
public void setUseremail(String useremail) {
this.useremail = useremail;
}
@Column(name = "outdate")
public Timestamp getOutdate() {
return outdate;
}
public void setOutdate(Timestamp ts) {
this.outdate = ts;
}
@Column(name = "signature")
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
展示層
findpass.jsp
<form id="findpass" action="findpassAdmin" method="post" >
<div class="form-group">
<label for="exampleInputEmail1">用戶名</label>
<input class="form-control" name="admin.useraccount" id="user_account" >
</div>
<div class="form-group">
<label for="exampleInputPassword1">曾綁定的郵箱賬號</label>
<input type="email" class="form-control" name="admin.useremail" id="user_email" >
</div>
<button type="submit" id="submitButton" class="btn btn-primary">下一步</button>
</form>
action層
AdminAction.java
package com.nms.action;
import com.nms.pojo.Admin;
import com.nms.service.AdminService;
import com.nms.util.MD5Util;
import com.nms.util.SendMail;
import com.opensymphony.xwork2.ActionContext;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.Random;
@Action("findpassAdmin")
public void findpass() throws IOException, AddressException, MessagingException {
Admin realaccount = adminservice.validate_pass(admin);
int j = -1;
//若賬號郵箱不匹配。則返回-1,ajax判斷,顯示失敗
if(realaccount == null) {
HttpServletResponse response=ServletActionContext.getResponse();
response.setContentType("text/javascript");
response.getWriter().print(j);
}
//若賬號郵箱匹配,則發送郵件
else {
long currentTime = System.currentTimeMillis() + 900000;//設置過期時間
Date time = new Date(currentTime);
Timestamp ts = new Timestamp(time.getTime());
Random random = new Random();
String key = realaccount.getId() + "|" + ts + "|" + random.nextInt();
String signature = MD5Util.MD5(key); //生成MD5加密碼
realaccount.setOutdate(ts);
realaccount.setSignature(signature);
boolean judge_update = adminservice.update(realaccount);//將重置信息添加到數據庫中
if(judge_update)
{
j = 1;
SendMail sendmail = new SendMail();
String url = "http://localhost:8080/myssh/isChangeAdmin.action"+"?uid=" + realaccount.getId() + "&validkey=" + signature; //改成你自己的修改密碼的下一個頁面就行了
sendmail.send(realaccount.getUseremail(), url, realaccount);
HttpServletResponse response=ServletActionContext.getResponse();
response.setContentType("text/javascript");
response.getWriter().print(j);
}
else {
HttpServletResponse response=ServletActionContext.getResponse();
response.setContentType("text/javascript");
response.getWriter().print(j);
}
}
}
Util包
其中MD5類MD5Util.java
package com.nms.util;
import java.security.MessageDigest;
public class MD5Util {
public final static String MD5(String s) {
char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
try {
byte[] btInput = s.getBytes();
// 獲得MD5摘要算法的 MessageDigest 對象
MessageDigest mdInst = MessageDigest.getInstance("MD5");
// 使用指定的字節更新摘要
mdInst.update(btInput);
// 獲得密文
byte[] md = mdInst.digest();
// 把密文轉換成十六進制的字符串形式
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
下面是郵件發送相關的代碼:
JAVA MAIL是利用現有的郵件賬戶發送郵件的工具,比如說,我在網易註冊一個郵箱賬戶,通過JAVA Mail的操控,我可以不親自登錄網易郵箱,讓程序自動的使用網易郵箱發送郵件。這一機制被廣泛的用在註冊激活和垃圾郵件的發送等方面。
JavaMail可以到http://www.oracle.com/technetwork/java/javamail/index-138643.html進行下載,並將mail.jar添加到classpath即可。
JAVA郵件發送的大致過程是這樣的的:
1、構建一個繼承自javax.mail.Authenticator的具體類,並重寫裏面的getPasswordAuthentication()方法。此類是用作登錄校驗的,以確保你對該郵箱有發送郵件的權利。
2、構建一個properties文件,該文件中存放SMTP服務器地址等參數。
3、通過構建的properties文件和javax.mail.Authenticator具體類來創建一個javax.mail.Session。Session的創建,就相當於登錄郵箱一樣。剩下的自然就是新建郵件。
4、構建郵件內容,一般是javax.mail.internet.MimeMessage對象,並指定發送人,收信人,主題,內容等等。
5、使用javax.mail.Transport工具類發送郵件。
SendMail.java 最終用來發送郵件的類,他要依賴下面兩個郵件類纔可以實現
package com.nms.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import com.nms.pojo.Admin;
public class SendMail {
public void send(String email,String url,Admin admin) throws AddressException, MessagingException
{
SimpleMailSender sms = new SimpleMailSender("[email protected]","bqfiohfurxkwdhba"); //這裏是你的郵箱地址和授權碼
String recipients = email;
Date date =new Date();
SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd"); //獲取當前時間
String datetime=sdf.format(date);
sms.send(recipients, "很重要! 找回密碼","尊敬的 "+admin.getUsername()+",您好!<br/><br/> 爲了找回您的密碼,請在十五分鐘之內點擊以下連接:<br/>"+url+" <br/> 如果不是您本人操作,請忽略此消息。<br/><br/><br/><br/>Mr.Wang "+datetime);
}
}
郵箱不能使用密碼直接登錄,要用生成的授權碼,獲取方法如下:
以qq郵箱爲例,進入郵箱後點擊設置,賬戶,開啓服務:POP3/SMTP服務,生成授權碼
就ok了
SimpleMailSender.java
package com.nms.util;
import java.util.List;
import java.util.Properties;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import com.nms.pojo.SimpleMail;
public class SimpleMailSender {
/*
* 簡單郵件發送器,可單發,羣發
*/
/**
*
* 發送郵件的props文件
*/
private final transient Properties props = System.getProperties();
/*
* 郵件服務器登錄驗證
*/
private transient MailAuthenticator authenticator;
/**
* 郵箱session
*/
private transient Session session;
/**
* 初始化郵件發送器
*
* @param smtpHostName
* SMTP郵件服務器地址
* @param username
* 發送郵件的用戶名(地址)
* @param password
* 發送郵件的密碼
*/
public SimpleMailSender(final String smtpHostName,final String username,final String password)
{
init(username,password,smtpHostName);
}
/**
* 初始化郵件發送器
*
* @param username
* 發送郵件的用戶名(地址),並以此解析SMTP服務器地址
* @param password
* 發送郵件的密碼
*
*/
public SimpleMailSender(final String username,final String password){
//通過郵箱地址解析出smtp服務器,對大多數郵箱都管用
final String smtpHostName = "smtp."+username.split("@")[1];
init(username,password,smtpHostName);
}
/**
* 初始化
*
* @param username
* 發送郵件的用戶名(地址)
* @param password
* 密碼
* @param smtpHostName
* SMTP主機地址
*/
private void init(String username,String password,String smtpHostName)
{
//初始化 props
props.put("mail.smtp.auth","true");
props.put("mail.smtp.host",smtpHostName);
//驗證
authenticator = new MailAuthenticator(username,password);
//創建session
session = Session.getInstance(props,authenticator);
}
/**
* 發送郵件
*
* @param recipient
* 收件人郵箱地址
* @param subject
* 郵件主題
* @param content
* 郵件內容
*
* @throws AddressException
* @throws MessagingException
*/
public void send(String recipient,String subject,Object content) throws AddressException,MessagingException{
//創建mime類型郵件
final MimeMessage message = new MimeMessage(session);
//設置發信人
message.setFrom(new InternetAddress(authenticator.getUsername()));
//設置收件人
message.setRecipient(RecipientType.TO,new InternetAddress(recipient));
//設置主題
message.setSubject(subject);
//設置郵件內容
message.setContent(content.toString(),"text/html;charset=utf-8");
//發送
Transport.send(message);
}
/**
*
* 羣發郵件
*
* @param recipients
* 收件人們
* @param subject
* 主題
* @param content
* 內容
* throws AddressException
* throws MessagingException
*/
public void send(List<String> recipients,String subject ,Object content) throws AddressException ,MessagingException{
//創建Mime類型郵件
final MimeMessage message = new MimeMessage(session);
//設置發信人
message.setFrom(new InternetAddress(authenticator.getUsername()));
//設置收信人們
final int num = recipients.size();
InternetAddress[] addresses = new InternetAddress[num];
for(int i=0;i<num;i++)
{
addresses[i] = new InternetAddress(recipients.get(i));
}
message.setRecipients(RecipientType.TO,addresses);
//設置主題
message.setSubject(subject);
//設置郵件內容
message.setContent(content.toString(),"text/html;charset=utf-8");
//發送
Transport.send(message);
}
/**
* 發送郵件
*
* @param recipient
* 收件人郵箱地址
* @param mail
* 郵件對象
* @throws AddressException
* @throws MessagingException
*/
public void send(String recipient,SimpleMail mail) throws AddressException,MessagingException{
send(recipient,mail.getSubject(),mail.getContent());
}
/**
* 羣發郵件
*
* @param recipients
* 收件人們
* @param
* 郵件對象
* @throws AddressException
* @throws MessagingException
*
*/
public void send(List<String> recipients,SimpleMail mail) throws AddressException,MessagingException
{
send(recipients,mail.getSubject(),mail.getContent());
}
}
MailAuthenticator.java
package com.nms.util;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
public class MailAuthenticator extends Authenticator{
private String username;
private String password;
public MailAuthenticator(String username,String password)
{
this.username = username;
this.password = password;
}
String getPassword(){
return password;
}
@Override
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(username,password);
}
String getUsername(){
return username;
}
public void setPassword(String password){
this.password = password;
}
public void setUsername(String username){
this.username = username;
}
}
重置密碼的部分就不說了,應該都知道,就是把發到郵箱裏的鏈接改成你自己的下一步修改密碼的網頁就可以正常編碼了。如果哪裏有遺漏請替我一下,隨時來修改,謝謝大家。
如果jar包找不到可以來找我要哦
參考 https://blog.csdn.net/zhuangjingyang/article/details/43603641