java 其他系统使用URL进行简易登录操作
访问方式如:
http://127.0.0.1:8080/IT/index.jsp?id=TWlMeUxpQHhMU1k2TFNYdk1DUDJMQ1AwTENAMExtLzx6Y2V5cHw=
TWlMeUxpQHhMU1k2TFNYdk1DUDJMQ1AwTENAMExtLzx6Y2V5cHw= 是加密之后的内容
加密方式:
第一步:获取当前的时间戳 (时间戳误差范围为不超过3分钟)
第二步:将以 用户ID{时间戳} 的方式使用base64进行加密
第三步:将以 加密后的字符串{dfzq} 的方式转换为char类型的数组,并循环数组;
将当个char以int的方式进行向左偏移一位,即-1 操作;并将其结果转换为String类型
第四步:将偏移之后的字符再进行base64加密,即得到的结果为加密之后的结果
解密与之相反
源代码,新建LoginUrlUtilsEncode.java
package com.services.frame;
import java.util.Base64;
import java.util.Calendar;
import java.util.Date;
import com.core.RPCException;
import com.exception.PBException;
/**
* 用户使用URL进行登录操作
* @author callens
*
*/
public class LoginUrlUtilsEncode {
private static final String salt="it";
public static String decoder(String encryptionData,String _salt) {
return decoderBase(encryptionData, _salt);
}
public static String decoder(String encryptionData) {
return decoderBase(encryptionData, salt);
}
/**
* 解码
* @param encryptionData
* @param _salt
* @return
*/
public static String decoderBase(String encryptionData,String _salt) {
String firstBase64="";
try {
firstBase64=new String(Base64.getDecoder().decode(encryptionData.getBytes()));
}catch(Exception e) {
e.printStackTrace();
throw new PBRightException(RPCException.ACCESS_DENIED, "用户登陆信息解码错误");
}
String offsetChars=offsetRight(firstBase64);
final String saltF="{"+_salt+"}";
String getSalt=offsetChars.substring(offsetChars.length()-saltF.length(),offsetChars.length());
if(!saltF.equals(getSalt)) {
throw new PBRightException(RPCException.ACCESS_DENIED, "用户登陆信息解码失败");
}
String secondBase64=offsetChars.replace(saltF, "");
String result=new String(Base64.getDecoder().decode(secondBase64.getBytes()));
String time=result.substring(result.indexOf("{"), result.length());
if(!checkTime(time)) {
throw new PBRightException(RPCException.ACCESS_DENIED, "用户登陆信息解码时间超时");
}
String userId=result.replace(time, "");
return userId;
}
private static boolean checkTime(String time) {
String reallyTime=time.substring(1,time.length()-1);
long finalTime=0l;
try {
finalTime=Long.parseLong(reallyTime);
}catch(Exception e) {
throw new PBRightException(RPCException.ACCESS_DENIED, "用户登陆信息解码时间戳失败");
}
Calendar calendar=Calendar.getInstance();
long endTime=calendar.getTime().getTime();
calendar.add(Calendar.MINUTE, -3);//计算三分钟之内的时间戳为正常登陆状态
long startTime=calendar.getTime().getTime();
if(startTime<=finalTime&&finalTime<=endTime) {
return true;
}
return false;
}
public static String encode(String userId,String _salt) {
return encodeBase(userId, _salt);
}
public static String encode(String userId) {
return encodeBase(userId, salt);
}
/**
* 编码
* @param userId
* @param _salt
* @return
*/
private static String encodeBase(String userId,String _salt) {
//获取当前时间戳
long nowTime=new Date().getTime();
//进行第一次base64编码
String firstBase64=Base64.getEncoder().encodeToString((userId+"{"+nowTime+"}").getBytes());
//加盐,所有字符进行偏移
String offsetChars=offsetLeft(firstBase64+"{"+_salt+"}");
//获得最终的加密结果
String secondBase64=Base64.getEncoder().encodeToString(offsetChars.getBytes());
return secondBase64;
}
/**
* 所有字符向左偏移一个单位
* @param base64
* @return
*/
public static String offsetLeft(String base64) {
char[] cArray = base64.toCharArray();
for (int i = 0; i < cArray.length; i++) {
cArray[i] = (char) (((int)cArray[i])-1);
}
return String.valueOf(cArray);
}
public static String offsetRight(String base64) {
char[] cArray = base64.toCharArray();
for (int i = 0; i < cArray.length; i++) {
cArray[i] = (char) (((int)cArray[i])+1);
}
return String.valueOf(cArray);
}
public static void main(String[] args) {
String base64=encode("admin");
System.out.println(base64);
String userId=decoder("TWlMeUxpQHhMU1k2TFNYdk1DUDJMQ1AwTENAMExtLzx6Y2V5cHw=");
System.out.println(userId);
//WFZRc2BWNDZMU1h2TUNQMkxpWDFNU2J4TDIvPHpjZXlwfA==
//TWlMeUxpQHhMU1k2TFNYdk1DUDJMQ1AwTENAMExtLzx6Y2V5cHw=
}
}
js 获取参数信息
/**
* 用于获取浏览器上的参数信息
* 比如:http://127.0.0.1:8080/it/user/getUser?userCode=1
* 传入字符串 userCode 返回 1
* 如果没有找到参数,则返回false 可以用if判断有没有返回值
* */
function getQueryVariable(variable) {
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
let param=vars[i];
let index=param.indexOf('=');
var pair = param.substring(0,index);
if (pair == variable) {
return param.substring(index+1,param.length);
}
}
return (false);
}
function login(){
//获取传入的参数
var encryptionData=getQueryVariable("id");
if(encryptionData){//使用URL进行登录操作
//进行登录操作
}
}