登录之找回密码-java发送邮件
2017-11-14 17:59
176 查看
找回密码整体思路 //当点击找回密码的时候: <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("user ca12 name");//邮件服务器用户名 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
相关文章推荐
- Java发送邮件找回密码功能的实现
- GitLab Server 发送邮件给新增用户使其通过邮箱中的链接去指定地址修改登录密码
- JavaMail发送邮件找回密码的功能
- Java实现邮箱登录验证和邮件发送
- .net 发送邮件(密码找回,注册确认)
- spring boot 整合 mail 发送邮件 【用户注册以及找回密码】
- python 实例7 为rhel添加系统用户与登录密码,并给root 发送邮件
- 找回密码,使用邮件发送方式
- 发送邮件 找回密码
- ASP.NET结合数据库,发送邮件找回密码
- 发送邮件,找回密码的功能
- CI框架使用PHPmailer发送邮件找回密码
- java web 发送邮件登录验证
- thinkphp实现发送邮件密码找回功能实例
- 找回密码 之发送邮件 接口
- 自动发送邮件 -- 密码找回功能的实现message
- Discuz教程之邮件找回密码邮件发送频率修改
- 网站登录密码忘记后,通过向手机发送验证码实现找回密码的实现方法
- thinkphp实现发送邮件密码找回功能实例
- SmtpClient发送邮件(用户找回密码)