首先说下思路:
用户填写自己的邮箱-->后台验证邮箱是否与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("3057854381@qq.com","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