- 浏览: 88849 次
- 性别:
文章分类
- 全部博客 (151)
- Spring-MVC学习 (5)
- 偶然间发现 (2)
- easyUi学习 (7)
- web项目相关技术 (4)
- java学习 (26)
- webService (4)
- 一些工具的安装使用 (7)
- js学习 (20)
- Sping学习 (7)
- mybatis学习 (5)
- 定时器 (4)
- oracle (2)
- JSP学习 (6)
- HTML一些标签 (1)
- web服务 (2)
- 偶尔得到的地址 (2)
- 常用的代码记录 (2)
- 设计模式 (1)
- java常使用的开源API (1)
- maven (1)
- Socket (1)
- nginx (2)
- jquery (3)
- poi (2)
- 写过的工具类 (19)
- 微信开发 (2)
- mysql (1)
- freemarker (2)
- ftp (1)
- 用过的软件 (1)
- jconsole (1)
- log4j (1)
- redis的简单入门使用 java调用redis (0)
- redis的使用 (2)
- 生活相关的 (1)
最新评论
-
chokee:
...
easyUi学习之开启行编辑模式增删改操作 -
lijie_insist:
就是有的界面需要显示天气啊!所以你要调用天气的接口啊 因为很多 ...
免费的天气接口的一个demo -
zhglance:
请问这是干什么用的呢?
免费的天气接口的一个demo
原文:http://www.cnblogs.com/zyw-205520/p/3738439.html
通过邮件找回密码功能的实现
1、最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回。现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回。通过java发送邮件的功能我就不说了,重点讲找回密码。
2、参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面}
重点就是如何生成这个url和如何解析这个url.
需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url 邮箱
3、加密能防止伪造攻击,一次url只能验证一次,并且绑定了用户。生成url: 可以用UUID生成随机密钥。
数字签名 = MD5(用户名+'′+过期时间+‘’+密钥key)
数据库字段(用户名(主键),密钥key,过期时间)
url参数(用户名,数字签名) ,密钥key的生成:在每一个用户找回密码时候为这个用户生成一个密钥key ,
url example:http://www.wechat68.com:80/CardSSHOK/checkLink?sid=K3xHOi4o/UihH5QYWBDfYA==&userName=123
生成过期时间,生成数字签名,生成url,发送邮件. AddU(用户名,密钥key,过期时间)
使用到的数据库如下
补充1:Timestamp类型对象在保存到数据的时候 毫秒精度会丢失。比如:2014-05-20 10:30:10.234 存到mysql数据库的时候 变成 2013-05-20 10:30:10.0。时间变得不相同了,sid 匹配的时候不会相等。 所以我做了忽略精度的操作。
补充2:解决linux下面title中文乱码
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
mailMessage.setSubject(MimeUtility.encodeText(mailInfo.getSubject(), "UTF-8", "B")); //解决linux邮件title乱码
通过邮件找回密码功能的实现
1、最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回。现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回。通过java发送邮件的功能我就不说了,重点讲找回密码。
2、参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面}
重点就是如何生成这个url和如何解析这个url.
需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url 邮箱
3、加密能防止伪造攻击,一次url只能验证一次,并且绑定了用户。生成url: 可以用UUID生成随机密钥。
数字签名 = MD5(用户名+'′+过期时间+‘’+密钥key)
数据库字段(用户名(主键),密钥key,过期时间)
url参数(用户名,数字签名) ,密钥key的生成:在每一个用户找回密码时候为这个用户生成一个密钥key ,
url example:http://www.wechat68.com:80/CardSSHOK/checkLink?sid=K3xHOi4o/UihH5QYWBDfYA==&userName=123
生成过期时间,生成数字签名,生成url,发送邮件. AddU(用户名,密钥key,过期时间)
使用到的数据库如下
package com.soq.card.web.action; import java.sql.Timestamp; import java.util.List; import java.util.UUID; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.Restrictions; import org.springframework.orm.hibernate3.HibernateTemplate; import com.soq.card.biz.UserHander; import com.soq.card.entity.Users; import com.soq.card.tools.DBhepler; import com.soq.card.tools.Mail; import com.soq.card.tools.Md5; import com.soq.card.web.base.BaseAction; /** * @author javen * @Email zyw205@gmail.com * */ public class PassEmailAction extends BaseAction { private Users users; private UserHander userHander; private String email; private String sid; private String userName; public String sendmail() { try { HibernateTemplate ht = this.getUserHander().getUsersDAO().getHibernateTemplate(); SessionFactory factory = ht.getSessionFactory(); Session session = factory.openSession(); Criteria criteria = session.createCriteria(Users.class); criteria.add(Restrictions.eq("loginName", email)); List<Users> list = criteria.list(); if (list.size() > 0) { users=list.get(0); Mail mail = new Mail(); String secretKey = UUID.randomUUID().toString(); // 密钥 Timestamp outDate = new Timestamp(System.currentTimeMillis() + 30 * 60 * 1000);// 30分钟后过期 long date = outDate.getTime() / 1000 * 1000;// 忽略毫秒数 mySql 取出时间是忽略毫秒数的 DBhepler bhepler=new DBhepler(); String sql="update users set outDate=?,validataCode=? where loginName=?;"; String str[] ={outDate+"",secretKey,users.getLoginName()}; bhepler.AddU(sql, str); //this.getUserHander().getUsersDAO().getHibernateTemplate().update(users); // 保存到数据库 System.out.println(" UserName>>>> "+users.getUserName()); String key =users.getUserName() + "$" + date + "$" + secretKey; System.out.println(" key>>>"+key); String digitalSignature = Md5.md5(key);// 数字签名 String path = this.getRequest().getContextPath(); String basePath = this.getRequest().getScheme() + "://" + this.getRequest().getServerName() + ":" + this.getRequest().getServerPort() + path + "/"; String resetPassHref = basePath + "checkLink?sid=" + digitalSignature +"&userName="+users.getUserName(); String emailContent = "请勿回复本邮件.点击下面的链接,重设密码<br/><a href=" + resetPassHref + " target='_BLANK'>" + resetPassHref + "</a> 或者 <a href=" + resetPassHref + " target='_BLANK'>点击我重新设置密码</a>" + "<br/>tips:本邮件超过30分钟,链接将会失效,需要重新申请'找回密码'" + key + "\t" + digitalSignature; mail.setTo(email); mail.setFrom("XX");// 你的邮箱 mail.setHost("smtp.163.com"); mail.setUsername("XXX@163.com");// 用户 mail.setPassword("CXXX");// 密码 mail.setSubject("[二维码名片]找回您的账户密码"); mail.setContent(emailContent); if (mail.sendMail()) { System.out.println(" 发送成功"); this.getRequest().setAttribute("mesg", "重置密码邮件已经发送,请登陆邮箱进行重置!"); return "sendMail"; } } else { this.getRequest().setAttribute("mesg", "用户名不存在,你不会忘记邮箱了吧?"); return "noUser"; } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return null; } public String checkResetLink() { System.out.println("sid>>>" + sid); if (sid.equals("") || userName.equals("")) { this.getRequest().setAttribute("mesg", "链接不完整,请重新生成"); System.out.println(">>>>> null"); return "error"; } HibernateTemplate ht = this.getUserHander().getUsersDAO().getHibernateTemplate(); SessionFactory factory = ht.getSessionFactory(); Session session = factory.openSession(); Criteria criteria = session.createCriteria(Users.class); criteria.add(Restrictions.eq("userName", userName)); List<Users> list = criteria.list(); if (list.size()>0) { users=list.get(0); Timestamp outDate = (Timestamp) users.getOutDate(); System.out.println("outDate>>>"+outDate); if(outDate.getTime() <= System.currentTimeMillis()){ //表示已经过期 this.getRequest().setAttribute("mesg", "链接已经过期,请重新申请找回密码."); System.out.println("时间 超时"); return "error"; } String key = users.getUserName()+"$"+outDate.getTime()/1000*1000+"$"+users.getValidataCode();//数字签名 System.out.println("key link》》"+key); String digitalSignature = Md5.md5(key);// 数字签名 System.out.println("digitalSignature>>>>"+digitalSignature); if(!digitalSignature.equals(sid)) { this.getRequest().setAttribute("mesg", "链接不正确,是否已经过期了?重新申请吧."); System.out.println("标示不正确"); return "error"; }else { //链接验证通过 转到修改密码页面 this.getRequest().setAttribute("user", users); return "success"; } }else { this.getRequest().setAttribute("mesg", "链接错误,无法找到匹配用户,请重新申请找回密码."); System.out.println("用户不存在"); return "error"; } } public Users getUsers() { return users; } public void setUsers(Users users) { this.users = users; } public UserHander getUserHander() { return userHander; } public void setUserHander(UserHander userHander) { this.userHander = userHander; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }
补充1:Timestamp类型对象在保存到数据的时候 毫秒精度会丢失。比如:2014-05-20 10:30:10.234 存到mysql数据库的时候 变成 2013-05-20 10:30:10.0。时间变得不相同了,sid 匹配的时候不会相等。 所以我做了忽略精度的操作。
补充2:解决linux下面title中文乱码
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
mailMessage.setSubject(MimeUtility.encodeText(mailInfo.getSubject(), "UTF-8", "B")); //解决linux邮件title乱码
发表评论
-
java生成水印
2017-02-20 11:28 475package com.zte.club.util; i ... -
获取随机码
2016-09-26 12:00 417/*** * 获取指定长度的随机验证码 * @pa ... -
导入数据脚本
2016-09-18 11:01 324-- mysql的脚本 把一个表的数据插入到另一个表 如果数据 ... -
使用base64decoder对文件互转来提供文件上传接口
2016-09-13 17:13 2292淘宝里面的html用base64转换图片,不知道为什么,不过看 ... -
物理分页相关与加载到底部
2016-08-18 10:32 244Integer pageSize = json.get(&qu ... -
java获取项目的路径以及请求的路径
2016-07-15 16:01 675/** *获取项目resource下面的config文件 ... -
java调用http接口以及提供接口
2016-07-08 17:20 620******************************* ... -
获取request请求的ip地址
2016-07-05 10:25 758// 获取访问的ip地址 public static St ... -
java web常用到的ajax分页思路
2016-05-13 16:04 1828有时候其实用同步的分页可以在url上记录页数 这样把链接分享给 ... -
excel的操作相关的---生成excell
2016-01-12 21:16 389/* * Decompiled with CFR 0_10 ... -
word的操作
2016-01-07 16:15 299// word的操作其中有对于那个阿拉伯到大写数字的操作 p ... -
邮件和短信的发送
2016-01-07 15:59 414package com.mes.util; import ... -
file文件的拷贝 以及ftp的下载
2016-01-07 15:54 429package com.zte.xh.fund.util; ... -
excel的操作相关的---读取excell内容
2016-01-07 15:47 418package com.zte.xh.fund.util; ... -
匹配字符串中的连续多少位数字
2015-08-07 08:53 450package com.zte.xh.fund.util; ... -
比对的一个工具类
2015-07-24 00:27 310package study.corejava.string; ... -
操作的File的一个小工具
2015-07-17 14:57 289// 保存下,都是对文件上传时遇到的一些问题,保存了以后用的时 ... -
java生成验证码图片
2015-07-06 09:39 643参考了些网上代码,自己写了一个验证 第一:写一个图片生成类 ...
相关推荐
C#源码--找回密码C#源码--找回密码
用户找回密码参考页面设计,明天必须用到的
项目实战之找回密码,net实现解密找回密码
密码找回逻辑漏洞总结密码找回逻辑漏洞总结密码找回逻辑漏洞总结密码找回逻辑漏洞总结密码找回逻辑漏洞总结密码找回逻辑漏洞总结密码找回逻辑漏洞总结密码找回逻辑漏洞总结密码找回逻辑漏洞总结密码找回逻辑漏洞总结...
找回密码(代码)--这几天收集的!
主要实现了用户注册邮箱验证,成功后发邮件到注册邮箱中去,然后可以去点击连接进行激活,不激活不能进行登录,会提示未激活账号,如果忘记密码可以通过邮箱或者用户名去找回密码发邮件到注册的邮箱,可以重新设置...
能够用java实现由邮箱找回密码的功能,
MyQQ 除实现基本功能外,还实现QQ号输入只能输入数字,找回密码窗体,外带皮肤!
PHP+MYSQL通过邮箱找回密码开发源码
邮件找回密码+无刷新验证码 邮件找回密码+无刷新验证码 邮件找回密码+无刷新验证码 邮件找回密码+无刷新验证码
JSP找回密码例子,本人已经调试,可以运行
找回密码(jsp) 很cool!
注册用户找回密码功能,将密码发送给用户注册时填写的邮箱
AndroidKeystorePasswordRecover.jar 使用方法: 1.创建一个passlib.txt 文件,里面写上你印象中存在的密码,一个占一行。...PS:找回密码的时间长短 取决于你第一步里面输入的可能存在的密码,一般情况很快就找回了。
web端基本的使用邮箱找回密码页面功能
登录界面、找回密码界面、修改密码界面的源代码。 在制作过程中,有使用CSS、JS、Jquery。其中还有cookie、base64的js插件。 每一次刷新登录页面都可以自动刷新验证码。 提供的源代码仅供参考,如有不足,请多多指教...
一个有关于用户通过邮箱找回密码的java小程序
运行“Default.aspx”文件,进入程序主界面。单击“会员注册”按钮,注册用户名和密码,然后单击“密码找回”按钮,根据提示填写相应的信息,即可将密码找回。
找回密码登录页面,密码发送成功报告页面,显示错误信息的页面
这是一款绿色清新风格的带有流程步骤的忘记密码找回密码验证表单代码,jQuery按步骤找回密码代码。