java 其他系统使用URL进行简易登录操作

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进行登录操作
        //进行登录操作
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你需要先安装Java和数据库,我以MySQL为例进行说明。 1. 创建数据库 首先,你需要创建一个名为"market"的数据库。你可以使用MySQL命令行或者图形界面工具如phpMyAdmin来创建数据库。 2. 创建表格 接着,你需要创建一个名为"sales"的表格来存储销售记录。表格包含以下字段: - id: 销售记录的唯一标识,自增长整数类型。 - date: 销售日期,日期类型。 - product: 销售的产品,字符串类型。 - quantity: 销售数量,整数类型。 - price: 产品单价,浮点数类型。 你可以使用以下SQL语句来创建表格: ```sql CREATE TABLE sales ( id INT AUTO_INCREMENT, date DATE, product VARCHAR(50), quantity INT, price FLOAT, PRIMARY KEY (id) ); ``` 3. 连接数据库 在Java程序中连接MySQL数据库需要使用Java的JDBC(Java Database Connectivity)API。你需要下载MySQL的JDBC驱动程序,然后在Java程序中加载驱动程序。你可以从MySQL官网下载最新版的JDBC驱动程序。 加载驱动程序的代码如下: ```java Class.forName("com.mysql.jdbc.Driver"); ``` 然后你需要定义连接数据库的URL、用户名和密码: ```java String url = "jdbc:mysql://localhost:3306/market"; String user = "username"; String password = "password"; Connection conn = DriverManager.getConnection(url, user, password); ``` 这里的"localhost"是你的MySQL服务器地址,"3306"是MySQL服务器的端口号,"market"是你创建的数据库名,"username"和"password"是MySQL登录的用户名和密码。 4. 插入数据 现在你可以向"sales"表格中插入销售记录。你可以使用以下代码来插入一条销售记录: ```java String sql = "INSERT INTO sales (date, product, quantity, price) VALUES (?, ?, ?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setDate(1, new java.sql.Date(new Date().getTime())); pstmt.setString(2, "apple"); pstmt.setInt(3, 10); pstmt.setFloat(4, 2.5f); pstmt.executeUpdate(); ``` 这里使用了PreparedStatement对象来插入数据,可以防止SQL注入攻击。使用setDate、setString、setInt和setFloat方法来设置参数,然后执行executeUpdate方法来执行SQL语句。 5. 查询数据 最后,你需要从"sales"表格中查询数据来计算收益。你可以使用以下代码来查询所有销售记录: ```java String sql = "SELECT * FROM sales"; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { int id = rs.getInt("id"); Date date = rs.getDate("date"); String product = rs.getString("product"); int quantity = rs.getInt("quantity"); float price = rs.getFloat("price"); float total = quantity * price; System.out.println(id + "\t" + date + "\t" + product + "\t" + quantity + "\t" + price + "\t" + total); } ``` 这里使用了Statement对象来执行SQL查询语句,然后使用ResultSet对象来获取查询结果。使用getInt、getDate、getString和getFloat方法来获取字段值,然后计算总收益并输出结果。 以上就是一个简单的Java终端超市收益管理系统的实现。你可以根据自己的需要对代码进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值