二:SSM邮件开发:找回密码
来源:互联网 发布:java中对象作用域 编辑:程序博客网 时间:2024/06/03 14:37
二:SSM邮件开发:找回密码
- -
jsp内容
- 用的ajax发送邮件;
- 提交邮箱和收到的验证码信息
(/video/WebContent/WEB-INF/jsp/front/user/forget_pwd.jsp)
<main> <div class="container"> <form class="ma" action="forgetpwd.do" method="post" > <div class="form_header"> <div class="form_title"> <h2>忘记密码</h2> <span>通过注册邮箱重设密码</span> </div> <div class="form_back"> <a href="index.do">返回立即登录</a> </div> </div> <div class="form_body"> <input type="email" placeholder="请输入登录邮箱" name="email" id="email"> <input type="text" placeholder="请输入验证码" name="captcha"><input type="button" value="发邮件获取验证码" onclick="submitEmail();"> <input type="submit" value="提交"> </div> <div class="form_footer"> <div class="FAQ"> <span>收不到邮件?查看</span><a href="#">常见问题</a> </div> </div> </form> </div> </main><%@include file="../include/script.html"%> <script type="text/javascript"> function submitEmail(){ var email = $('#email').val(); //改为ajax提交邮箱 if(email!=null&&email!=''){ $.post('sendemail.do',{email:email},function(data){ console.log(data); if(data.success){ alert('验证码已发送到邮箱,请注意查收'); }else{ alert('验证码发送失败:'+data.message); } },'json'); } } </script>
其中抽出来了需要引入的js
文档结构:(/video/WebContent/WEB-INF/jsp/front/include/script.html)
<script src="static/js/jquery-1.12.4.min.js"></script><script src="static/js/jquery.validate.min.js"></script><script src="static/js/jquery-confirm.min.js"></script><script src="static/js/common.js"></script>
- 重置密码页面(/video/WebContent/WEB-INF/jsp/front/user/reset_pwd.jsp)
<main> <div class="container"> <form class="ma" action="resetpwd.do" method="post"> <input type="hidden" name="email" value="${email}"/> <input type="hidden" name="captcha" value="${captcha}"/> <div class="form_header"> <div class="form_title"> <h2>重置密码</h2> </div> </div> <div class="form_body"> <input type="password" placeholder="请输入新密码" id="password" name="password"> <input type="password" style="width:100%" placeholder="再次输入新密码" id="password02" name="pwdAgain"> <input type="submit" style="margin:0px;width:100%" value="提交"> </div> </form> </div> </main>
Controller层书写
- FrontHomeController
/** * Created By gf on 2017年7月18日 * Descr: 负责前台首页的跳转 * */@Controllerpublic class FrontHomeController extends FrontBaseController{ @Autowired IFrontUserService userService; /** * 首页跳转 * Created by gf on 2017年7月19日 * * @return */ @RequestMapping("/index.do") public String index(){ return "front/index"; } /** * 跳到找回密码页面,包括发邮件获取验证码、重置密码 * Created by gf on 2017年7月19日 * * @return */ @RequestMapping(value="forgetpwd.do",method=RequestMethod.GET) public String findPassword(){ return "front/user/forget_pwd"; } /** * 请求发送邮件,目前来说只有找回密码有发送邮件功能,如果多个功能都有,就要考虑复用性和url名字可识性 * Created by gf on 2017年7月19日 * 改为ajax方式 2017-07-25 * @param email * @return */ @ResponseBody @RequestMapping(value="sendemail.do",method=RequestMethod.POST) public Map sendEmail(String email){ HashMap map = new HashMap(); //根据给定的邮箱发送邮件 UserModel user = userService.queryUserByEmail(email); if(user==null){ //用户为空,说明填写的邮箱就不对 map.put("success", false); map.put("message","邮箱账号不存在"); return map; } //先生成验证码,先发送邮件,发送成功后保存验证码 String captcha = RandomCode.getRandomCode(CAPTCHA_LENGTH); //先发送验证码,发送成功了再保存到数据库 boolean b = SendEmailUtil.sendPasswordCaptchaEmail(email,captcha); if(b){ //发送成功,保存 map.put("success", true); map.put("message", "验证码已发送到您的邮箱,请注意查收"); userService.updateUserCaptcha(email,captcha); }else{ //发送失败,提醒 map.put("success", false); map.put("message","验证码发送失败,请检查邮箱账号"); } return map; } /** * 提交邮箱和收到的验证码信息 * Created by gf on 2017年7月19日 * * @return */ @RequestMapping(value="forgetpwd.do",method=RequestMethod.POST) public String findPasswordPost(String email,String captcha,Model model){ //校验验证码和邮箱信息是否有效 UserModel user = userService.queryUserByEmail(email); if(user==null){ //用户为空,说明填写的邮箱就不对 model.addAttribute("message","邮箱账号不存在"); }else{ if(captcha!=null&&!captcha.equals("")&&captcha.equals(user.getCaptcha())){ //验证成功了,返回重置密码的页面 model.addAttribute("email", email); model.addAttribute("captcha", captcha); return "front/user/reset_pwd"; }else{ //验证码不对或验证码不存在 model.addAttribute("message","验证码不正确或不存在"); } } return "front/user/forget_pwd"; } /** * 提交重置密码请求,包括新密码、邮箱接收的验证码等 * Created by gf on 2017年7月19日 * * @return */ @RequestMapping(value="resetpwd.do",method=RequestMethod.POST) public String resetPassword(ResetPwdInfo info,Model model){ //重置密码 //先检查提交的邮箱和验证码信息是否有效,和上一步的验证一样,然后再去更新此邮箱的用户密码 //这里都省略了数据校验 //校验验证码和邮箱信息是否有效 UserModel user = userService.queryUserByEmail(info.getEmail()); if(user==null){ //用户为空,说明填写的邮箱就不对 model.addAttribute("message","邮箱账号不存在"); }else{ String captcha = info.getCaptcha(); if(captcha!=null&&!captcha.equals("")&&captcha.equals(user.getCaptcha())){ //验证成功了,返回重置密码的页面 //验证成功了,更新密码,然后跳转到首页,重新让用户登录 userService.updateUserPwd(user.getId(),MD5Utils.getMd5Simple(info.getPassword())); //删除验证码 userService.cleanCaptcha(user.getEmail()); model.addAttribute("message", "密码更新成功了,请重新登录");// return "front/message"; //跳到首页了,其实应该用ajax,返回个更新成功的消息的 return "redirect:/index.do"; }else{ //验证码不对或验证码不存在 model.addAttribute("message","验证码不正确或不存在"); } } return "front/user/forget_pwd"; }}
- FrontBaseController
package com.xxxxxx.video.controller;import javax.servlet.http.HttpSession;import com.xxxxxx.video.model.UserModel;/** * Created By gf on 2017年7月19日 * Descr: 放置一些前台控制器公用的功能 * */public class FrontBaseController { static final String SESSION_USER = "_front_user"; static final int CAPTCHA_LENGTH = 5;//验证码长度 /** * 用户登陆后,将用户信息放到session中,但是哪些信息要放,可以在这里统一管理 * Created by gf on 2017年7月19日 * * @param session * @param user */ public void loginSession(HttpSession session,UserModel user){ session.setAttribute(SESSION_USER, user); } /** * 获取当前已登录用户信息 * Created by gf on 2017年7月20日 * * @param session * @return */ public UserModel getCurrentUser(HttpSession session){ return (UserModel)session.getAttribute(SESSION_USER); } /** * 用户退出登录时,需要从session中移除哪些信息,也可以统一在这里管理 * Created by gf on 2017年7月19日 * * @param session */ public void logoutSession(HttpSession session){ session.removeAttribute(SESSION_USER); }}
工具类
- MD5加密工具类
package com.xxxxxx.video.util;import org.springframework.util.DigestUtils;/** * MD5加密工具类 * @author Administrator * */public class MD5Utils { /* * 将一个字符串MD5加密,方式很多,我们使用的是Spring包下 */ public static String getMd5Simple(String password){ String md502 =DigestUtils.md5DigestAsHex(password.getBytes()); return md502; } public static void main(String[] args){ System.out.println(getMd5Simple("111111")); }}
- 邮件工具类
package com.xxxxxx.video.util;import java.util.Date;import java.util.Properties;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;/** * Created By gf on 2017年7月19日 * Descr: 最终进行发送邮件的代码部分,如果对过程不了解,参考MailTest.java文件 * */public class Mail { private static String myEmailAccount = "@qq.com";//修改为自己的qq邮箱账号 private static String myEmailPassword = "";//修改为自己的邮箱授权码 private static String myEmailSMTPHost = "smtp.qq.com";//如果用qq邮箱不用修改,如果用163邮箱,修改为smtp.163.com private static String sendUser = "Video视频系统"; public static void send(String receive,String title,String body) throws Exception { Properties props = new Properties(); props.setProperty("mail.transport.protocol", "smtp"); props.setProperty("mail.smtp.host", myEmailSMTPHost); props.setProperty("mail.smtp.auth", "true"); final String smtpPort = "465"; props.setProperty("mail.smtp.port", smtpPort); props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.socketFactory.port", smtpPort); Session session = Session.getDefaultInstance(props); session.setDebug(true); MimeMessage message = createMimeMessage(session, myEmailAccount, receive,title,body); Transport transport = session.getTransport(); transport.connect(myEmailAccount, myEmailPassword); transport.sendMessage(message, message.getAllRecipients()); transport.close(); } /** * 创建邮件对象 * Created by gf on 2017年7月19日 * * @param session * @param sendMail * @param receiveMail * @param title * @param body * @return * @throws Exception */ private static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail,String title,String body) throws Exception { // 1. 创建一封邮件 MimeMessage message = new MimeMessage(session); // 2. From: 发件人 message.setFrom(new InternetAddress(sendMail, sendUser, "UTF-8")); // 3. To: 收件人(可以增加多个收件人、抄送、密送) message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "尊敬的用户", "UTF-8")); // 4. Subject: 邮件主题 message.setSubject(title, "UTF-8"); // 5. Content: 邮件正文(可以使用html标签) message.setContent(body, "text/html;charset=UTF-8"); // 6. 设置发件时间 message.setSentDate(new Date()); // 7. 保存设置 message.saveChanges(); return message; }}
package com.xxxxxx.video.util;/** * Created By gf on 2017年7月19日 * Descr: 发送邮件的工具类 * */public class SendEmailUtil { /** * 发送邮件 * Created by gf on 2017年7月19日 * * @param receiveEmail 收件人邮箱地址 * @param emailTitle 邮件标题 * @param emailBody 邮件正文 * @return */ public static boolean sendEmail(String receiveEmail,String emailTitle,String emailBody){ System.out.println(">>>开发发送邮件:\n"+receiveEmail+"\n"+emailTitle+"\n"+emailBody+"\n"); try { Mail.send(receiveEmail, emailTitle, emailBody); } catch (Exception e) { e.printStackTrace(); System.out.println("发送邮件出错了!!"); return false; } return true; } /** * 发送找回密码验证码的邮件 * Created by gf on 2017年7月19日 * * @param receiveEmail * @param validateCode * @return */ public static boolean sendPasswordCaptchaEmail(String receiveEmail,String validateCode){ return sendEmail(receiveEmail, "找回密码-验证码", "您正在进行找回密码操作,当前验证码为:"+validateCode); }}
service mapper 省略
- mapping
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace的路径必须是mapper接口的路径 --> <mapper namespace="com.xxxxxx.video.mapper.FrontUserMapper"> <!-- 封装查询结果 --> <resultMap type="UserModel" id="userMap"> <id property="id" column="id"/> <result property="nickName" column="nick_name"/> <result property="sex" column="sex"/> <result property="birthday" column="birthday"/> <result property="birthdayStr" column="birthday_str"/> <result property="email" column="email"/> <result property="province" column="province"/> <result property="city" column="city"/> <result property="headUrl" column="head_url"/> <result property="password" column="password"/> <result property="insertTime" column="insert_time"/> <result property="updateTime" column="update_time"/> <result property="captcha" column="captcha"/> </resultMap> <!-- 根据邮箱查询用户 --> <select id="queryUserByEmail" resultMap="userMap"> select *,date_format(birthday,'%Y-%m-%d') as birthday_str from user where email=#{email} </select> <!-- 新增用户 --> <insert id="insertUserModel" parameterType="UserModel" useGeneratedKeys="true" keyProperty="id"> insert into user(nick_name,password,sex,birthday,province,city,head_url,insert_time,update_time,email) values(#{nickName},#{password},#{sex},#{birthday},#{province},#{city},#{headUrl},#{insertTime},#{updateTime},#{email}) </insert> <!-- 更新用户基本信息,不包括密码和头像 --> <update id="updateUserInfo" parameterType="UserModel"> update user set nick_name=#{nickName},sex=#{sex},birthday=#{birthday},province=#{province}, city=#{city},update_time=#{updateTime} where id=#{id} </update> <!-- 根据id查询用户 --> <select id="queryUserById" resultMap="userMap"> select *,date_format(birthday,'%Y-%m-%d') as birthday_str from user where id=#{id} </select> <!-- 更新验证码 --> <update id="updateCaptcha" parameterType="java.util.HashMap"> update user set captcha=#{captcha} where email=#{email} </update> <!-- 更新用户密码 --> <update id="updateUserPwd" parameterType="java.util.HashMap"> update user set password=#{pwd} where id=#{id} </update> <update id="updateUserHead" parameterType="java.util.HashMap"> update user set head_url=#{head} where id=#{id} </update></mapper>
阅读全文
0 0
- 二:SSM邮件开发:找回密码
- ssm项目:找回密码
- 发送邮件 找回密码
- 用邮件找回密码
- Struts2 发邮件找回密码
- springmvc 邮件发送(找回密码)
- SmtpClient发送邮件(用户找回密码)
- asp.net 邮件找回密码功能、
- 用户激活和找回密码发送邮件
- magento会员邮件找回密码连接无效
- 发送邮件 激活用户或找回密码
- 通过邮件找回密码功能的实现
- 通过邮件找回密码功能的实现
- 发送找回密码邮件(个人笔记)
- 通过邮件找回密码功能的实现
- 找回密码 之发送邮件 接口
- 透过邮件找回密码功能的实现
- 找回密码,使用邮件发送方式
- oracle in函数限制
- Javascript闭包理解与用法
- objectmapper的转化问题
- 属性
- Linux
- 二:SSM邮件开发:找回密码
- 配置hibernate trace日志会损耗多少性能?
- Leetcode||40. Combination Sum II
- 默认的fedora有java,没有javac解决
- Apache与Nginx的优缺点比较
- Dubbo基础概念
- android自定义相机拍照
- VMware安装centos7,装机前配置双网卡,装机后只显示单网卡信息
- Hadoop+Spark 之旅—脚踏实地、仰望星空(教程目录)