现在越来越多的登录方式都用到了token作为用户登录令牌,所以实现了一个token生成和校验案例。
缺点:该实现方式token是存储在内存中,不适合分布式项目,如需改为分布式项目部署,可把token存储在redis中,其中的实现原理还是保持不变。
一)token编码工具类
package com.oysept.token.utils;
/**
* 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[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);