最近项目中需要用到忘记密码的功能,因此,写了这篇博客进行记录。

首先需要用户点击忘记密码,输入用户名和邮箱,两者可以匹配,则向邮箱中发送条链接。eg:

点击此链接进行密码修改,有效期一个小时www.abc.com?ha=2HwBjxyI4WDRBUwewvo8xioRXszig1tf1Vx4dSMa5wI

点击此链接进行重置密码,后台接受到ha参数的值,并对其进行解析,通过则可以进行密码修改。

下边主要解释如何加密这个ha参数,这里使用到了Base64进行加密和解密。

这里利用了一个jar包:commons-codec-1.8.jar(可以从官网或者maven下载)

commons-codec

commons-codec

1.8

加密和解密工具类如下:

package com.ocean.utils;

import org.apache.commons.codec.binary.Base64;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import java.security.SecureRandom;

public class UrlUtils {

private static final String KEY = "myoMwO6qPt&3AD";

private static final Logger LOGGER = LoggerFactory.getLogger(UrlUtils.class);

public static String enCryptAndEncode(String content) {

try {

byte[] sourceBytes = enCryptAndEncode(content, KEY);

return Base64.encodeBase64URLSafeString(sourceBytes);

} catch (Exception e) {

LOGGER.error(e.getMessage(), e);

return content;

}

}

/**

* 加密函数

* @param content 加密的内容

* @param strKey 密钥

* @return 返回二进制字符数组

* @throws Exception

*/

public static byte[] enCryptAndEncode(String content, String strKey) throws Exception {

KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");

keyGenerator.init(128, new SecureRandom(strKey.getBytes()));

SecretKey desKey = keyGenerator.generateKey();

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.ENCRYPT_MODE, desKey);

return cipher.doFinal(content.getBytes("UTF-8"));

}

public static String deCryptAndDecode(String content) throws Exception {

byte[] targetBytes = Base64.decodeBase64(content);

return deCryptAndDecode(targetBytes, KEY);

}

/**

* 解密函数

* @param src 加密过的二进制字符数组

* @param strKey 密钥

* @return

* @throws Exception

*/

public static String deCryptAndDecode(byte[] src, String strKey) throws Exception {

KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");

keyGenerator.init(128, new SecureRandom(strKey.getBytes()));

SecretKey desKey = keyGenerator.generateKey();

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.DECRYPT_MODE, desKey);

byte[] cByte = cipher.doFinal(src);

return new String(cByte, "UTF-8");

}

}

发送链接时,可以使用这个工具类,对参数进行加密和解密。我这个采用的方式是:对 用户名+";"+邮箱+";"+时间戳 进行加密和解密

下面来一个测试类

@Test

public void test1() throws Exception{

long endTimes = System.currentTimeMillis()+3600*1000; //设置一小时有效时间。。

String para = "admin"+";"+"20@qq.com"+";"+endTimes;

System.out.println("原文"+para);

String encode = UrlUtils.enCryptAndEncode(para);

System.out.println("加密"+encode); //http://www.cnblogs.com/haha12/p/4345070.html

String old = UrlUtils.deCryptAndDecode(encode);

System.out.println("解密:"+old);

String[] split = old.split(";");

for (String string : split) {

System.out.println(string);

}

}

打印结果如下:

原文admin;20@qq.com;1541492725208

加密2HwBjxyI4WDRBUwewvo8xhcxtyeFhvB2tMG2W3QYwW0

解密:admin;20@qq.com;1541492725208

admin

20@qq.com

1541492725208

后台可以通过拿到这个参数值,解密之后进行处理。例子如下:

public String toResetPwd(){

String ha = context.getParameter("ha");

if(null!=ha){

try {

//这里拿到参数,进行解密操作

String decode = UrlUtils.deCryptAndDecode(ha);

String[] split = decode .split(";");

List list = Arrays.asList(split);

if(null!=list && list.size()>0){

String personname = (String)list.get(0);

String email = (String)list.get(1);

long entimes = Long.parseLong((String)list.get(2));

long curtime = System.currentTimeMillis();

if(entimes<=curtime){ //判断有效期

context.setRequestAttribute("errorMsg", "当前链接已失效,请重新 后去重置密码链接!");

}else{

context.setRequestAttribute("personname", personname);

context.setRequestAttribute("email", email);

}

}

} catch (Exception e) {

e.printStackTrace();

context.setRequestAttribute("errorMsg", "链接无效!");

}

}

return "SUCCESS";

}

到这里,就可以结束了。

重置功能怎么实现java_java实现忘记密码功能相关推荐

  1. 使用shiro框架的项目增加忘记密码功能遇到的一些问题

    开发忘记密码功能遇到的问题 后端验证功能用的是shiro框架,当前端发送AJax请求到后端,如果在application.yml文件中没有将找回页面所需要调用的接口配置为匿名,那么这些接口不会不调用, ...

  2. c/c++编程日记:纯C实现登录注册和忘记密码功能(附源码)

    这是一个用纯C语言和文件操作实现的系统的登录.注册和忘记密码功能.可以用于c语言大作业的登录系统.下面分享一下具体的代码. 首先定义一个结构体来存放用户的注册信息,账号密码等. typedefstru ...

  3. android实现忘记密码功能,手机忘记密码如可解决 安卓手机重置密码教程【详解】...

    许多安卓手机用户都会为自己的手机设置一个密码,方便保护自己的手机隐私,但是密码变化多次之后,自己有时候也会忘记密码,尤其是图形密码,更是容易记混了.那么,安卓手机忘记密码该怎么办呢?一起来看看今天小编 ...

  4. Android忘记密码功能实现

    连续好几天学习都没有什么进展,然而在今天这个烂漫的日子.突然有了学习的动力.想起来前几日老师给布置的android忘记密码的功能实现.今天也有了想法.就是按照老师的建议,简单的回答一个问题,实现此功能 ...

  5. ThinkPHP5聚合数据短信验证码接口实现注册/忘记密码功能

    1.前端页面主要代码 这里点击发送验证码按钮通过ajax将相关信息传到后端getSms方法中. <form class="form-horizontal form-signin&quo ...

  6. android实现忘记密码功能,Android忘记密码功能

    您可以使用此tar文件 的activation.jar additionnal.jar 的mail.jar 使用这种方法 public void send() throws Exception { S ...

  7. android怎么实现记住密码功能,安卓 实现记住用户名和密码功能

    开发步骤: 在程序布局中键入复选框 在LoginActivity类中加入登陆处理的方法 3.在 LoginActivity类中加入是否记住密码的判断方法 4.运用SharedPreferences进行 ...

  8. java web 邮箱激活 与 忘记密码(重置密码)

    推荐: java后台通用权限管理系统(springboot)(https://blog.csdn.net/zwx19921215/article/details/97806078) 推荐:java 个 ...

  9. java学习笔记——众筹项目练习——项目中的忘记密码(密码找回)与记住我(自动登录)功能 和 返回json数据低版本浏览器显示下载问题的解决、众筹系统架构重构

                                          忘记密码(密码找回) 忘记密码(密码找回)这个功能可以说是目前所有为别人提供服务的软件系统都具备的基础功能啦!很普遍,因为总 ...

最新文章

  1. Android APP破解利器Frida之反调试对抗
  2. 用户资源管理DBMS_RESOURCE_MANAGER
  3. html超文本链接本页面,从HTML语言到网上家园 第三章 超文本链接(1)-网页设计,HTML/CSS...
  4. OLAP引擎:基于Presto组件进行跨数据源分析
  5. linux红帽6架设apache,linux Redhat6.5 中 编译安装apache
  6. yum 快速安装 LAMP
  7. 滑动平均_善杰告诉您初中物理学滑动变阻器的各种作用
  8. 简要复习模拟电子技术_基本元器件介绍
  9. php数据库单循环显示,单循环赛制的PHP实现
  10. a标签 vue 动态点击_vue 中a标签如何实现点击赋值
  11. mysql3306端口被占用无法终止_Mysql3306端口被占用无法启动解决办法.doc
  12. uni-app 快速集成 IM 即时通信的方法——TUIKit 来啦
  13. js Web APIs
  14. 统信UOS系统桌面回收站图标删除
  15. 数字图像处理之目标颜色识别
  16. 【2019-08-14】慢慢来,才叫快
  17. win7 android 双系统平板 p1000,优派Windows7/Android双系统ViewPad 100
  18. 安装VS2003出现“FrontPage 2000 WEB 扩展客户端”安装失败时
  19. 定义求x的n次幂的函数,并返回计算结果
  20. 主机屋延长免费空间使用期限攻略

热门文章

  1. SDUST 点在圆内吗?
  2. 怎么查笔记本显示器屏幕大小尺寸
  3. 【有奖征集】 | 解锁程序YUAN的1024面
  4. 服务器维修工程师面试,设备维修工程师面试内容有哪些?
  5. 基于JavaWeb的酒店客房预定管理系统
  6. JM(264)基础知识整理
  7. AR增强现实 Augmented Reality
  8. 使用tkinter实现猜数字游戏
  9. 在STM32F103C8T6上使用RT_Thread Nano移植控制台和Finsh
  10. Caused by java lang ClassNotFoundException org aspectj wea