忘记密码
来源:互联网 发布:大数据薪资待遇 编辑:程序博客网 时间:2024/05/17 00:17
通过邮箱来做忘记密码功能
controller:
@RequestMapping(value = "/getpwd") public String getpwd() { return "/getpwd"; } @RequestMapping(value = "/getpwd", method = RequestMethod.POST) public String getpwd(String email,Model model, HttpServletRequest request) { User u = userService.findByEmail(email); if (u != null) { PasswordUserHelper helper = new PasswordUserHelper(); helper.setAccountId(u.getId()); helper.setGenerateTime(new Date()); passwordUserHelperService.save(helper); String serverName = request.getServerName(); int remotePort = request.getServerPort(); String domian = serverName.substring(serverName.indexOf(".") + 1); if (serverName.split("\\" + ".").length < 3) { domian = serverName; } String basePath = domian + (remotePort == 80 ? "" : (":" + remotePort)) + request.getContextPath(); request.setAttribute("basePath", basePath); System.out.println(request.getAttribute("basePath")); Object[] parameters = { u.getName(), helper.getId(), request.getAttribute("basePath")}; String to = email; String subject = i18n("fetch.password.subject"); String content = i18n("fetch.password.body", parameters, null); sendMailToFetchPassword(to, subject, content); model.addAttribute("uuid", helper.getId()); } else { model.addAttribute("errorMessage","errorMessage"); return "/getpwd"; } return "/getpwd_wait"; } @ResponseBody @RequestMapping(value = "/regetpwd") public void reSendFetchPasswordMail(String uuid, HttpServletRequest request) { PasswordUserHelper helper = passwordUserHelperService.findById(uuid); if(helper !=null){ User u = userService.findById(helper.getAccountId()); String serverName = request.getServerName(); int remotePort = request.getServerPort(); String domian = serverName.substring(serverName.indexOf(".") + 1); if (serverName.split("\\" + ".").length < 3) { domian = serverName; } String basePath = domian + (remotePort == 80 ? "" : (":" + remotePort)) + request.getContextPath(); request.setAttribute("basePath", basePath); Object[] parameters = {u.getName(), helper.getId(), request.getAttribute("basePath")}; String to = u.getEmail(); String subject = i18n("fetch.password.subject"); String content = i18n("fetch.password.body", parameters, null); sendMailToFetchPassword(to, subject, content); } } @RequestMapping(value = "/fetchpassword",params={"id"}) public String fetchpassword(String id,ModelMap model) { model.addAttribute("uuid", id); return "/fetchpassword"; } @RequestMapping(value = "/fetchpassword",params={"uuid"},method=RequestMethod.POST) public String changepassword(String uuid,ModelMap model,String password,HttpServletRequest request) { PasswordUserHelper helper = passwordUserHelperService.findById(uuid); if(helper !=null){ User u = userService.findById(helper.getAccountId()); password = CommonUtils.getMD5(password); u.setPassword(password); userService.update(u); String serverName = request.getServerName(); int remotePort = request.getServerPort(); String domian = serverName.substring(serverName.indexOf(".") + 1); if (serverName.split("\\" + ".").length < 3) { domian = serverName; } String basePath = domian + (remotePort == 80 ? "" : (":" + remotePort)) + request.getContextPath(); model.addAttribute("basePath",basePath ); } return "/fetchpassword_success"; } protected String i18n(String message) { return messageSource.getMessage(message, null, null); } protected String i18n(String message,Object[] prams,Locale locale) { return messageSource.getMessage(message, prams, locale); } private void sendMailToFetchPassword(String to,String subject,String content){ final String _to = to; final String _subject = subject; final String _content = content; new Thread(new Runnable() { @Override public void run() { try { mailService.sendHtmlMail(_to, _subject, _content); } catch (MessagingException e) { String msg = String.format("Error when send mail to %s[fetch passwod]", _to); LOGGER.error(msg, e); } } }).start(); }
PasswordUserHelper这个类很重要,为了安全,不透露ID的:
@Entity@Table(name = "passwordUserhelper")public class PasswordUserHelper extends BasicEntity implements Serializable{ public String getId() { return id; } public void setId(String id) { this.id = id; } public Date getGenerateTime() { return generateTime; } public void setGenerateTime(Date generateTime) { this.generateTime = generateTime; } public Long getAccountId() { return accountId; } public void setAccountId(Long accountId) { this.accountId = accountId; } private static final long serialVersionUID = 1L; @Id @GenericGenerator(name="idGenerator", strategy="uuid") @GeneratedValue(generator="idGenerator") private String id; private Long accountId; private Date generateTime;}
service:
@Servicepublic class MailServiceImpl implements MailService{ private static final Logger LOGGER = LoggerFactory.getLogger(MailServiceImpl.class); @Autowired private JavaMailSender mailSender; @Override public void sendHtmlMail(String to, String subject, String htmlContent) throws MessagingException { MimeMessage message = mailSender.createMimeMessage(); // use the true flag to indicate you need a multipart message MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); helper.setTo(to); helper.setSubject(subject); // use the true flag to indicate the text included is HTML helper.setText(htmlContent, true); mailSender.send(message); } public void sendMail(final String to,final String subject,final String body){ Runnable r = new Runnable() { @Override public void run() { try { sendHtmlMail(to, subject, body); } catch (MessagingException e) { LOGGER.error(String.format("Error when send mail to %s", to),e); } } }; new Thread(r).start(); }}
@Servicepublic class PasswordUserHelperServiceImpl implements PasswordUserHelperService{ @Autowired private PasswordUserHelperDao passwordUserHelperDao; @Autowired private UserDao userDao; @Transactional @Overridepublic void save(PasswordUserHelper entity) { passwordUserHelperDao.save(entity);} @Transactional @Override public void delete(String id) { passwordUserHelperDao.delete(id); } @Transactional @Override public void update(PasswordUserHelper t) { passwordUserHelperDao.update(t); } @Override public PasswordUserHelper findById(String id) { return passwordUserHelperDao.findById(id); } @SuppressWarnings("deprecation")@Transactional(noRollbackFor=TimeoutException.class) @Override public User fetchPassword(String uuid, String password) throws NoSuchAlgorithmException, UnsupportedEncodingException, ItemNotFoundException { User user= null; Date now = new Date(); PasswordUserHelper helper = findById(uuid); if(helper==null){ throw new ItemNotFoundException(); } Long dis = now.getTime() - helper.getGenerateTime().getTime(); if(dis - 30 * 60 * 1000 > 0){ delete(uuid); try {throw new TimeoutException();} catch (TimeoutException e) {// TODO Auto-generated catch blocke.printStackTrace();} } user = userDao.findById(helper.getAccountId()); if(user != null){ PassAndSalt passAndSalt = PasswordEncoder.saltEncode(password); user.setPassword(passAndSalt.getSalt()); //user.setSalt(passAndSalt.getSalt()); userDao.update(user); delete(uuid); } return user; }}
还有个很重要的配置,邮箱配置:
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host" value="xxx" /> <property name="port" value="xxx" /> <property name="username" value="xxx" /> <property name="password" value="xxx" /> <property name="javaMailProperties"> <props> <!-- Use SMTP transport protocol --> <prop key="mail.transport.protocol">smtp</prop> <!-- Use SMTP-AUTH to authenticate to SMTP server --> <prop key="mail.smtp.auth">true</prop> <!-- Use TLS to encrypt communication with SMTP server --> <prop key="mail.smtp.starttls.enable">true</prop> <prop key="mail.debug">false</prop> </props> </property> </bean>
具体参照svn
0 0
- 忘记密码
- 忘记密码
- 忘记密码
- mysql密码忘记重置密码
- mysql忘记密码修改密码
- Mysql-忘记密码-密码修改
- weblogic忘记密码,重置密码
- mac忘记密码 重设密码
- zabbix忘记密码,重设密码
- mysql忘记密码,密码重置
- ECshop 忘记密码,重置密码
- Mysql密码忘记,恢复密码
- 忘记mysql密码,修改密码
- Oracle 忘记密码,密码修改
- 忘记mysql 密码,修改密码
- mysql忘记密码修改密码
- jenkins --忘记密码修改密码
- Jenkins 忘记密码,修改密码
- HDOJ题目2086 A1 = ?(数学)
- .net mvc 微信开发笔记(五)------JSON解析,自定义菜单
- Oracle GoldenGate环境中主库和备库 网络突然中断后,主端的dp进程无法启动的问题
- 黑马程序员_JavaBean
- UVa 10193 - All You Need Is Love
- 忘记密码
- 图表控件TeeChart干货分享(绘制2D、3D实时曲线---VC++示例源代码--网络首发)
- POJ 3185 The Water Bowls(高斯消元,枚举变元)
- Swift初见
- 2012年9月15日锐捷网络嵌入式研发笔试
- HDU 3635 Dragon Balls 七龙珠 Union Find算法
- Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)
- Python查找文件内容
- linux 常用查看系统配置命令