热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

重置功能怎么实现java

最近项目中需要用到忘记密码的功能,因此,写了这篇博客进行记录。首先需要用户点击忘记密码,输入用户名和邮箱,两者可以匹配,则向邮箱中发送条链接。eg:点击此链接进行密码修改,有效期一

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

首先需要用户点击忘记密码,输入用户名和邮箱,两者可以匹配,则向邮箱中发送条链接。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";

}

到这里,就可以结束了。


推荐阅读
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 多维数组的使用
    本文介绍了多维数组的概念和使用方法,以及二维数组的特点和操作方式。同时还介绍了如何获取数组的长度。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
author-avatar
9小酒
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有