登录之找回密码-java发送邮件

找回密码整体思路
//当点击找回密码的时候:
<a href="/login/forgot" target="_blank" id="btnForget" style="color: black; text-decoration: none;">找回密码</a>

//请求后台(login.java)返回页面(forgotPwd.ftl)
@RequestMapping("/forgot")
	public String forgot(HttpSession session, HttpServletRequest request,
			ModelMap map) {
		return "main/forgotPwd";
	}
	
//跳转到找回密码页面:(forgotPwd.ftl)
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="renderer" content="webkit">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>重置密码申请</title>
</head>
<body>
	<div class="container-fluid">
		<div class="row">
			<div class="col-md-12">
				<form class="form-horizontal" role="form">
                    <fieldset style="width:60%;margin:20px auto;">
                        <legend><h3><span style="color:red;">重置密码申请</span></h3></legend>
	                       <div class="form-group" style="width:100%;margin:20px auto;margin-top:50px;">
	                          <label class="col-sm-3 control-label" for="email">邮箱:</label>
	                          <div class="col-sm-5">
	                             <input type="text" class="form-control" id="email" placeholder="请输入您帐号所绑定的邮箱"/>
	                          </div>
	                          <div class="col-sm-4">
	                          	<label id="j-msg" class="login-msg"></label>
	                          </div>
	                       </div>  
                    </fieldset>     
                </form>
			</div>
		</div>
		<div class="row">
			<div class="col-md-12" style="margin:0 auto;margin-top:50px;">
				 <form class="form-horizontal" role="form">
				 	<div class="form-group" style="width:60%;margin:0 auto;">
				 		<div style="float:right;">
                 			<button type="button" class="btn btn-primary btn-lg" style="width:200px;" id="btnSave">发送邮件</button>
                 		</div>
                 	</div>
                 </form>
           </div>
        </div>
	</div>
</body>
<script type="text/javascript">
	$(function() {
		$('#btnSave').click(function() {
			var email = $('#email').val();
			var regex = /^([0-9A-Za-z\-_\.]+)@([0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?)$/g;
			
			if(email != 'undefined' && email.length<=0) {
				$("#j-msg").html("请输入e-mail地址");
				return false;
			}else if(!regex.test(email)) {
				$("#j-msg").html("e-mail地址不正确!");
			}else {
				$("#j-msg").html('');
			}
			$.ajax({
				type : 'get',
				url : '${request.contextPath}/login/sendMail',//请求后台接口
				data : {'email':email},//获取输入的邮箱地址
				dataType : 'json',
				async : false,
				success : function(data) {
					//0-发送失败	1-发送成功		2-无此用户
					if(data == '1') {
						$.messager.alert('提示','邮件发送成功,请注意查收!','info',function() {
		                	$('#email').val('');
	                    });
					}else if(data == '0') {
						$.messager.alert('提示','邮件发送失败!','info',function() {
		                	$('#email').val('');
	                    });
					}else if(data.key == '2') {
						$.messager.alert('提示','此用户不存在,请确认!','info',function() {
		                	$('#email').val('');
	                    });
					}
				}
			});
		});
	})
</script>
</html>

//根据ajax请求后台的请求后台(login.java)的sendMail方法。
@ResponseBody
@RequestMapping("/sendMail")
public String sendMail(String email, HttpServletRequest request) {
	// 0-发送失败 1-发送成功 2-无此用户
	if (StrUtil.isBlank(email)) {//email为“”或者为null走if
		return "2";
	}
	String query = "SELECT * from sys_user WHERE email = '" + email + "'";//根据邮箱查询用户表是否有该用户
	List<SysUser> users = sqlMapper.selectList(query, SysUser.class);
	if (null != users && users.size() > 0) {
		SysUser user = users.get(0);
		if (null != user) {
			try {
				String secretKey = UUID.randomUUID().toString(); // 密钥
				Timestamp outDate = new Timestamp(
						System.currentTimeMillis() + 30 * 60 * 1000); // 30分钟后过期
				long date = outDate.getTime() / 1000 * 1000; // 忽略毫秒数
				user.setValidatecode(secretKey);//Validatecode秘钥
				user.setOutdate(outDate.toString());//outDate过期时间
				sysUserMapper.updateByPrimaryKey(user); // 更新用户数据
				String key = user.getLoginname() + "$" + date + "$"
						+ secretKey;

				EmailUtils.sendResetPasswordEmail(user, key, request);
			} catch (Exception e) {
				e.printStackTrace();
				return "0";
			}
		}
	} else {
		return "2";
	}
	return "1";
}
EmailUtils工具类
package com.zhiming.util.mails;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Timestamp;
import java.util.Date;
import java.util.Properties;
import java.util.UUID;

import javax.mail.Authenticator;
import javax.mail.Message.RecipientType;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.http.HttpServletRequest;

public class EmailUtils {
	static String FROM = "";
	static String PWD = "";
	static {
		Properties prop = new Properties();
		InputStream is = EmailUtils.class.getResourceAsStream("eamil.properties");
		try {
			prop.load(is);			
			FROM = prop.getProperty("username");//邮件服务器用户名
			PWD = prop.getProperty("password");//邮件服务器密码
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 注册成功后,向用户发送帐户激活链接的邮件
	 * @param user 未激活的用户
	 */
	public static void sendAccountActivateEmail(SysUser user) {
		Session session = getSession();
		MimeMessage message = new MimeMessage(session);
		try {
			message.setSubject("帐户激活邮件");
			message.setSentDate(new Date());
			message.setFrom(new InternetAddress(FROM));
			message.setRecipient(RecipientType.TO, new InternetAddress(user.getEmail()));
			message.setContent("<a href='" + GenerateLinkUtils.generateActivateLink(user)+"'>点击激活帐户</a>","text/html;charset=utf-8");
			// 发送邮件
			Transport.send(message);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 发送重设密码链接的邮件
	 * SysUser user 用户实体
	 */
	public static void sendResetPasswordEmail(SysUser user,String key,HttpServletRequest request) {
		
		Session session = getSession();
		MimeMessage message = new MimeMessage(session);///生成消息体
		try {
			message.setSubject("找回您的密码");// 设置邮件主题 
			message.setSentDate(new Date());
			message.setFrom(new InternetAddress(FROM));
			message.setRecipient(RecipientType.TO, new InternetAddress(user.getEmail()));
			message.setContent("请勿回复本邮件, 重置密码请使用以下链接:<br/><a href='" + GenerateLinkUtils.generateResetPwdLink(user,key,request) +"'>点击重新设置密码</a>" + 
							"<br/>此邮件不用回复,若非本人操作,请忽略!<br/>本邮件超过30分钟,链接将会失效,需要重新申请'找回密码'","text/html;charset=utf-8");
			// 发送邮件
			Transport.send(message);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static Session getSession() {
		Properties props = new Properties();
		props.setProperty("mail.transport.protocol", "smtp");
		props.setProperty("mail.smtp.host", "smtp.163.com");
		props.setProperty("mail.smtp.port", "25");
		props.setProperty("mail.smtp.auth", "true");
		Session session = Session.getInstance(props, new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(FROM, PWD);
			}	
		});
		return session;
	}
}
//GenerateLinkUtils工具类,点击右键链接时调用generateResetPwdLink方法。
package com.zhiming.util.mails;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;

/**
 * 生成帐户激活、重新设置密码的链接
 */
public class GenerateLinkUtils {
	
	private static final String CHECK_CODE = "checkCode";
	
	/**
	 * 生成重置密码的链接
	 */
	public static String generateResetPwdLink(SysUser user,String key,HttpServletRequest request) {
		
		String digitalSignature = md5(key);//数字签名
		
		String serverName = request.getServerName();
		int serverPort = request.getServerPort();
		return "http://" + serverName + ":" + serverPort +request.getContextPath()+"/login/change?uuid=" + user.getCheckid() + "&sid=" + digitalSignature;
	}
	//md5加密
	public static String md5(String string) {
		MessageDigest md = null;
		try {
			md = MessageDigest.getInstance("md5");
			md.update(string.getBytes());
			byte[] md5Bytes = md.digest();
			return bytes2Hex(md5Bytes);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}	
		return null;
	}	
	private static String bytes2Hex(byte[] byteArray)
	{
		StringBuffer strBuf = new StringBuffer();
		for (int i = 0; i < byteArray.length; i++)
		{
			if(byteArray[i] >= 0 && byteArray[i] < 16)
			{
				strBuf.append("0");
			}
			strBuf.append(Integer.toHexString(byteArray[i] & 0xFF));
		}
		return strBuf.toString();
	}
}

@RequestMapping("/change")
	public String change(HttpSession session, HttpServletRequest request,
			ModelMap map) {
		Map<String, Object> maps = new HashMap<String, Object>();

		String uuid = request.getParameter("uuid");
		String sid = request.getParameter("sid");
		if (StrUtil.isNotBlank(uuid)) {
			session.setAttribute("check", uuid);
		}
		if (StrUtil.isBlank(sid)) {
			maps.put("result", "找回密码链接已失效!");
			return "main/error";
		}
		String sql = "SELECT * from sys_user WHERE checkid = '" + uuid + "'";
		SysUser user = sqlMapper.selectOne(sql, SysUser.class);
		if (null == user) {
			maps.put("result", "链接错误,无法找到匹配用户,请重新申请找回密码!");
			return "main/error";
		}
		String outDate = user.getOutdate();
		Timestamp od = Timestamp.valueOf(outDate);
		if (od.getTime() <= System.currentTimeMillis()) {
			map.put("result", "链接已经过期,请重新申请找回密码!");
			return "main/error";
		}
		return "main/changePwd";
	}
	
跳转到修改密码界面(changePwd.ftl)
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="renderer" content="webkit">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>重置密码申请</title>
	<style type="text/css">
		.login-msg {
			color:#FF8000;
			background:url(${request.contextPath}/resources/common/images/icon_wrong.png) left center no-repeat;
			padding-left:20px;
		}
	</style>
</head>
<body>
	<div class="container-fluid">
		<div class="row">
			<div class="col-md-12">
				<form class="form-horizontal" role="form">
                    <fieldset style="width:60%;margin:20px auto;">
                        <legend><h3><span style="color:red;">重置密码申请</span></h3></legend>
	                       <div class="form-group" style="width:100%;margin:20px auto;margin-top:50px;">
	                          <label class="col-sm-3 control-label" for="pwd">新密码:</label>
	                          <div class="col-sm-5">
	                             <input type="password" class="form-control" id="pwd" placeholder="请输入新密码"/>
	                          </div>
	                          <div class="col-sm-4">
	                          	<label id="j-msg" class="login-msg"></label>
	                          </div>
	                       </div>
	                       <div class="form-group" style="width:100%;margin:20px auto;">
	                          <label class="col-sm-3 control-label" for="newPwd">确认密码:</label>
	                          <div class="col-sm-5">
	                             <input type="password" class="form-control" id="newPwd" placeholder="请输入确认密码"/>
	                          </div>
	                          <div class="col-sm-4">
	                          	<label id="j-msg-r" class="login-msg"></label>
	                          </div>
	                       </div>
                    </fieldset>     
                </form>
			</div>
		</div>
		<div class="row">
			<div class="col-md-12" style="margin:0 auto;margin-top:50px;">
				 <form class="form-horizontal" role="form">
				 	<div class="form-group" style="width:60%;margin:0 auto;">
				 		<div style="float:right;">
				 		<button type="button" class="btn btn-primary btn-lg" style="width:200px;" id="btnReset">重置表单</button>
                 		<button type="button" class="btn btn-primary btn-lg" style="width:200px;" id="btnSave">保存密码</button>
                 		</div>
                 	</div>
                 </form>
           </div>
        </div>
	</div>
</body>
<script type="text/javascript">
	var clearBox = function() {
		$('#pwd').val('');
		$('#newPwd').val('');
		$("#j-msg").html('');
		$("#j-msg-r").html('');
	}
	
	$(function() {

		$('#btnReset').click(function() {
			clearBox();
		});
		
		$('#btnSave').click(function() {
			var pwd = $('#pwd').val();
			var newPwd = $('#newPwd').val();
			var regex = new RegExp(/[A-Za-z].*[0-9]|[0-9].*[A-Za-z]/g);
			
			if(pwd != 'undefined' && pwd.length<=0) {
				$("#j-msg").html("请输入新密码");
				return false;
			}else if(pwd.length<6 || pwd.length>10) {
				$("#j-msg").html("密码长度为6-10位!");
				return false;
			}else if(!regex.test(pwd)) {
				$("#j-msg").html("密码必须包括字母与数据!");
				return false;
			}else {
				$("#j-msg").html('');
			}
		
			if(newPwd != 'undefined' && newPwd.length<=0) {
				$("#j-msg-r").html("请输入确认密码");
				return false;
			}else {
				$("#j-msg-r").html('');
			}
			if(pwd.trim() != newPwd.trim()) {
				$("#j-msg-r").html("确认密码与新密码输入不一致!");
				return false;
			}else {
				$("#j-msg").html('');
			}
	            
			$.ajax({
				type : 'get',
				url : '${request.contextPath}/login/changePwd',
				data : {'pwd':pwd},
				dataType : 'json',
				async : false,
				success : function(data) {
					//0-必填项不能为空	1-修改成功      2-此用户不存在	  3-修改失败!
					if(data.key == '1') {
						$.messager.alert('提示','密码修改成功,请使用新密码登录!','info',function() {
		                	clearBox();
	                    });
					}else if(data.key == '0') {
						$.messager.alert('提示','必填项不能为空!','info',function() {
		                	clearBox();
	                    });
					}else if(data.key == '2') {
						$.messager.alert('提示','此用户不存在,请确认!','info',function() {
		                	clearBox();
	                    });
					}else if(data.key == '3') {
						$.messager.alert('提示','密码修改失败,请联系管理员!','info',function() {
		                	clearBox();
	                    });
					}
				}
			});
			
		});
	})
</script>
</html>

//点击保存密码更新用户表
@ResponseBody
@RequestMapping("/changePwd")
public Map<String, Object> changePwd(String pwd, HttpSession session) {
	// 0-必填项不能为空 1-修改成功 2-此用户不存在 3-修改失败!
	Map<String, Object> result = new HashMap<String, Object>();
	String check = (String) session.getAttribute("check");
	if (StrUtil.isBlank(check) || StrUtil.isBlank(pwd)) {
		result.put("key", "0");
		return result;
	}
	String selectSql = "SELECT * from sys_user WHERE checkid = '" + check
			+ "'";
	List<SysUser> list = sqlMapper.selectList(selectSql, SysUser.class);
	if (null != list && list.size() > 0) {
		SysUser user = list.get(0);
		if (null != user) {
			try {
				String jmPwd = MD5.string2MD5(pwd);
				user.setPassword(jmPwd);
				sysUserMapper.updateByPrimaryKeySelective(user);
				result.put("key", "1");
				return result;
			} catch (Exception e) {
				e.printStackTrace();
				result.put("key", "3");
				return result;
			}

		} else {
			result.put("key", "2");
			return result;
		}
	} else {
		result.put("key", "2");
		return result;
	}
}

email.properties//配置文件

username=1234343@163.com
password=1323232




jar包

javaMail-mail-1.4.jar、 activation.jar










  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
专业开发源码,功能强大 oa功能有OA功能列表: 1、通知发布:通知发布采用office在线编辑器,良好的可视环境,可插入附件、图片,图文混排。立即发布即刻显示在系统首页,支持点击统计。发布后,可自由管理,修改与删除。 2、短消息系统:本oa系统根据各部门与用户2级生成用户列表,可轻松选择接收对象,无迟缓与刷新。同时,支持系统消息群发,与对某部门群发。此外,可自由定制好友群组,选择常用对象集中发送。   当用户一登陆oa后,系统会文字链接、动画、语音系统提示,设计人性化。同时,用户对收到的短消息也可在线回复与转发,删除。 3、文件传输:本oa文件传输系统,可轻松选择用户对象,一次可最多6个文件。同时也可以直接传给自己。可查看文件传输历史记录。速度极快。  用户登陆系统后,会有文字链接、动画、语音系统提示,并有链接。进入文件系统后,可对最新文件进行在线阅读,下载,转发,回复,删除等。  同时,本系统还按照部门对文件分类,便于查阅与管理。  为最大保证系统文件传输安全,程序内部加强了对文件类型及大小的默认设置。这些设置可由管理员在后台轻松设置与调整。做到既安全又便捷,一切为用户考虑。 4、公文收发:按照各部门对象,用户可轻松选择文件上传。同时,也可将公文群发,系统将标识其群发公文,只占用一条记录。既保证速度有节省服务器空间。  oa用户登陆后,即可以得到提示,点击链接后,即可在线阅读公文,下载。同时也可签阅,对自己的签阅意见进行修改与删除。 还可查看自己发送的历史记录,可删除。 5、邮件服务:包括内外网邮件,手机wap邮件服务。内网邮件即是短消息系统集成。外网邮件:支持internet邮件发送,接收,回复等。  手机wap邮件服务,本办公系统内置wap手机邮件程序,支持手机服务,真正做到移动办公,走遍天下。 6、共享下载:本办公自动化系统开通了企业内部信息共享下载通道,各用户可对需要共享的文件、图片、动画、视频、音乐等进行共享。用户进入共享共享区后可在线浏览文件,看图片、动画、视频、听音乐等。 用户共享的文件可随时停止共享,删除等,轻松管理。 7、新闻发布:oa系统集成了office在线编辑器,可轻松发布最新信息,文字、图片、视频、动画,支持附件添加。同时,文字编辑可进行加粗,下划线,复制、剪切,撤消、还原等操作。此外,发布的新闻可修改与删除管理。发布的新闻直接显示在系统桌面首页,格式统一,显示发布时间、发布人,点击数等。 8、会议记录:各部门可实时撰写会议记录及会后记录。主要填写会议主题、内容、主持人、与会人等。会议记录管理包括修改、删除、是否公开等,实时存储与显示。 9、制度管理:用户可将各部门规章制度文件上传到系统,浏览制度可在“单位制度”栏进行浏览、下载。同时,按照部门,对制度文件分类管理,浏览。上传的制度文件可自行删除。 10、工作总结:支持月总结、季度总结、年度总结。总结撰写,主要根据月份、季度、年度,常规工作,下一步工作计划,创新、问题反馈、意见与建议等项目填写存储。同时,撰写完毕后,可查看管理,包括浏览、修改、删除等。按照权限不同,上级部门可浏览自己的总结。 11、工作日程:用户可按需写自己的工作日程安排,选择日期后填写,到了日程安排那天,登陆oa无纸化办公系统即可收到文字及动画与语音提示。同时,写完的日程可修改,删除操作等。 12、工作计划:用户可在系统内写各人工作计划,同时可进行浏览查看,修改、删除管理的操作。 13、工作周报:各部门负责人可每周对部门工作进行汇报,填写相关信息,以便及时梳理工作,反馈问题,及时解决。同时,系统会存储历史记录。 14、通讯录:用户可填写同事好友的通讯方式,拥有自己的通讯录。可方便修改与删除等。 15、资产管理:各部门可对资产进行录入,修改,查看,报废管理操作等。 16、网络考勤:系统用户只需在设定的时间内可轻松考勤,分上下午时间段。考勤记录保存,可浏览自己与本部门人员考勤记录,营造公平激励环境。上级领导可查看员工考勤记录。同时,系统还会对缺勤,进行友情提醒。 17、密码管理:用户可自由修改密码。用户登陆后,提交自己的email,实现密码与电子邮件的绑定。日后,用户忘记密码后,就可以只输入帐号,自主取回密码了。系统将自动把密码发送到先前绑定的email中。 19、排名服务:系统将实时统计用户登陆情况,按照部门、用户,对登陆前30名进行排名。以鼓励用户登陆,体现部门间的良性竞争。 20、后台管理:帐号增加,开通与关闭,删除。部门增加管理。登陆日志,密码查询服务等,轻松管理整个系统正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值