package com.zjn.token;
/**
* token编码工具类
* @author ouyangjun
*/
public class TokenEncryptUtils {
// 编码密码,可自定义
private static final String ENCODED_PASSWORD = "ouyangjun"; /**
* 编码
* @param str
* @return
*/
public static String encoded(String str) {
return strToHex(encodedString(str, ENCODED_PASSWORD));
} /**
* 转换
* @param str
* @param password
* @return
*/
private static String encodedString(String str, String password) {
char[] pwd = password.toCharArray();
int pwdLen = pwd.length; char[] strArray = str.toCharArray();
for (int i=0; i<strArray.length; i++) {
strArray[i] = (char)(strArray[i] ^ pwd[i%pwdLen] ^ pwdLen);
}
return new String(strArray);
} private static String strToHex(String s) {
return bytesToHexStr(s.getBytes());
} private static String bytesToHexStr(byte[] bytesArray) {
StringBuilder builder = new StringBuilder();
String hexStr;
for (byte bt : bytesArray) {
hexStr = Integer.toHexString(bt & 0xFF);
if (hexStr.length() == 1) {
builder.append("0");
builder.append(hexStr);
}else{
builder.append(hexStr);
}
}
return builder.toString();
} /**
* 解码
* @param str
* @return
*/
public static String decoded(String str) {
String hexStr = null;
try {
hexStr = hexStrToStr(str);
} catch (Exception e) {
e.printStackTrace();
}
if (hexStr != null) {
hexStr = encodedString(hexStr, ENCODED_PASSWORD);
}
return hexStr;
} private static String hexStrToStr(String hexStr) {
return new String(hexStrToBytes(hexStr));
} private static byte[] hexStrToBytes(String hexStr) {
String hex;
int val;
byte[] btHexStr = new byte[hexStr.length()/2];
for (int i=0; i<btHexStr.length; i++) {
hex = hexStr.substring(2*i, 2*i+2);
val = Integer.valueOf(hex, 16);
btHexStr[i] = (byte) val;
}
return btHexStr;
} }

  

package com.zjn.token;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry; /**
* token生成和校验
* @author ouyangjun
*/
public class TokenUtilsmm {
private static Map<String,String> MAP_TOKENS = new HashMap<String,String>();
private static final int VALID_TIME = 60*60*2; // token有效期(秒)
public static final String TOKEN_ERROR = "F"; // 非法
public static final String TOKEN_OVERDUE = "G"; // 过期
public static final String TOKEN_FAILURE = "S"; // 失效 /**
* 生成token,该token长度不一致,如需一致,可自行MD5或者其它方式加密一下
* 该方式的token只存在磁盘上,如果项目是分布式,最好用redis存储
* @param str: 该字符串可自定义,在校验token时要保持一致
* @return
*/
public static String getToken(String str) {
String token = TokenEncryptUtils.encoded(getCurrentTime()+","+str);
MAP_TOKENS.put(str, token);
return token;
} /**
* 校验token的有效性
* @param token
* @return
*/
public static String checkToken(String token) {
if (token == null) {
return TOKEN_ERROR;
}
try{
String[] tArr = TokenEncryptUtils.decoded(token).split(",");
if (tArr.length != 2) {
return TOKEN_ERROR;
}
// token生成时间戳
int tokenTime = Integer.parseInt(tArr[0]);
// 当前时间戳
int currentTime = getCurrentTime();
if (currentTime-tokenTime < VALID_TIME) {
String tokenStr = tArr[1];
String mToken = MAP_TOKENS.get(tokenStr);
if (mToken == null) {
return TOKEN_OVERDUE;
} else if(!mToken.equals(token)) {
return TOKEN_FAILURE;
}
return tokenStr;
} else {
return TOKEN_OVERDUE;
}
}catch (Exception e) {
e.printStackTrace();
}
return TOKEN_ERROR;
} /**获取当前时间戳(10位整数)*/
public static int getCurrentTime() {
return (int)(System.currentTimeMillis()/1000);
} /**
* 移除过期的token
*/
public static void removeInvalidToken() {
int currentTime = getCurrentTime();
for (Entry<String,String> entry : MAP_TOKENS.entrySet()) {
String[] tArr = TokenEncryptUtils.decoded(entry.getValue()).split(",");
int tokenTime = Integer.parseInt(tArr[0]);
if(currentTime-tokenTime > VALID_TIME){
MAP_TOKENS.remove(entry.getKey());
}
}
} /**
* 测试
* @param args
*/
public static void main(String[] args) {
String str = "username_and_password"; // 获取token
String token = TokenUtilsmm.getToken(str);
System.out.println("token Result: " + token); // 校验token
String checkToken = TokenUtilsmm.checkToken(token);
System.out.println("checkToken Result: " + checkToken);
if(str.equals(checkToken)) {
System.out.println("==>token verification succeeded!");
} } }

  

java中token的生成和验证的更多相关文章

  1. Java实现token的生成与验证-登录功能

    一.token与cookie相比较的优势1.支持跨域访问,将token置于请求头中,而cookie是不支持跨域访问的: 2.无状态化,服务端无需存储token,只需要验证token信息是否正确即可,而 ...

  2. 要求根据RandomStr.java:使用类型转换生成六位验证字符串,示例程序每次运 行时,都会生成不同的字符串。

    1.程序设计思想验证码 ①定义一个字符串变量来保存随机生成的. ②利用循环产生六位随机数,在产生每一位时将其转换为char类型并写在字符串后面. ③利用对话框显示生成的验证码,并提示用户输入验证码. ...

  3. Spring Boot项目中使用 TrueLicense 生成和验证License(服务器许可)

    一 简介 License,即版权许可证,一般用于收费软件给付费用户提供的访问许可证明.根据应用部署位置的不同,一般可以分为以下两种情况讨论: 应用部署在开发者自己的云服务器上.这种情况下用户通过账号登 ...

  4. Redis 在java中的使用(登录验证,5分钟内连续输错3次密码,锁住帐号,半小时后解封)(三)

    在java中使用redis,做简单的登录帐号的验证,使用string类型,使用redis的过期时间功能 1.首先进行redis的jar包的引用,因为用的是springBoot,springBoot集成 ...

  5. 在java中调用mockjs生成模拟数据

    一.手写版 在前端有个模拟数据的神器 Mock.js 能生成随机数据,拦截 Ajax 请求,然后我觉得他的这个生成随机数据不错.然后我就到度娘一顿操作,没找到类似的java实现,于是就有了下面的代码: ...

  6. java中Token验证

    什么是Token:它是一个令牌,随机不可预测的. 为什么需要使用Token: 1,防止表单的重复提交 2:,防止跨站点的请求伪造 Token的使用流程是:首先在服务器端生成一个随机的token值并在服 ...

  7. Java中使用OpenSSL生成的RSA公私钥进行数据加解密

    当前使用的是Linux系统,已经按装使用OpenSSL软件包, 一.使用OpenSSL来生成私钥和公钥 1.执行命令openssl version -a 验证机器上已经安装openssl 1 open ...

  8. Java中使用OpenSSL生成的RSA公私钥

    RSA是什么:RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力的 ...

  9. Java中使用OpenSSL生成公钥私钥进行数据加解密

    当前使用的是Linux系统,已经安装OpenSSL软件包. 一.使用OpenSSL来生成私钥和公钥1.执行命令openssl version -a 验证机器上已经安装openssl $ openssl ...

随机推荐

  1. dubbo源码调试

    1.从github上clone下duboo的源码并checkout tag到2.6.5可以看到如下的结构: 其中all-dubbo的pom如下: 这里会将dubbo的其他项目在package的时候打到 ...

  2. PADS CAM光绘输出文件设置

    PADS CAM光绘输出文件设置 在使用PADS完成电路板的设计后,通常还需要在CAM350中经过一些处理生成Gerber文件,交给制板厂商进行电路板的生产,这就要求在PADS中设置生成CAM文件,然 ...

  3. 等待多线程完成的CountDownLatch(带示例)

    开始磨刀霍霍向多线程了,这期是 CountDownLatch 的一个小示例. 定义:CountDownLatch 允许一个或多个线程等待其他线程完成操作. 应用需求举例:假设有4个线程,A.B.C.D ...

  4. 20200203_windows2012下安装mysql 5.7.29

    一.   检查系统版本: 二. 下载mysql, 下载地址: https://dev.mysql.com/downloads/mysql/5.7.html#downloads 三.   解压下载后的压 ...

  5. C#数据结构-二叉树-链式存储结构

    对比上一篇文章"顺序存储二叉树",链式存储二叉树的优点是节省空间. 二叉树的性质: 1.在二叉树的第i层上至多有2i-1个节点(i>=1). 2.深度为k的二叉树至多有2k- ...

  6. Python+爬虫+xlwings发现CSDN个人博客热门文章

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 最近几天老猿博客的访问量出现了比较大的增长,从常规的1000-3000之间波动的范围一下子翻了将近一倍,粉丝增长从日均10-40人也增长了差不多一倍 ...

  7. PyQt(Python+Qt)学习随笔:使用QColorDialog.getColor交互设置部件的颜色

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 PyQt中的部件只要是QWidget的派生类都可以在Designer或 ...

  8. PyQt(Python+Qt)学习随笔:QTableWidget项编辑方法editItem、openPersistentEditor

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 1.触发编辑项的editItem方法 QTableWidget提供了触发项编辑的方法,调用语法如下: ...

  9. Hive基本原理及配置Mysql作为Hive的默认数据库

    Hive是什么? Hive是基于Hadoop之上的数据仓库: Hive是一种可以存储.查询.分析存储在hadoop中的大规模数据 Hive定义了简单的类SQL查询语言,成为HQL,它允许熟悉SQL的用 ...

  10. pandas 处理缺失值(连续值取平均,离散值fillna"<unk>")

    # 2.1处理缺失值,连续值用均值填充 continuous_fillna_number = [] for i in train_null_ix: if(i in continuous_ix): me ...