对url路径中的参数进行加密--Java
需求:
后台对一些比较敏感的参数进行数据加密,然后在传送到前端。当前端跳转到后台时,再由后台对其进行解密。
参考 针对url参数的加密解密算法(java版)
修改:对中间的js页面加密代码改写为java
package com.example.utils;
import java.util.Random;
import java.util.regex.Pattern;
/*
*功能:对url加密算法(只针对window.location.href跳转,不针对post表单提交及ajax方式)
*算法:对于暴露在浏览器地址栏中的属性值进行加密,如一个属性为agentID=1,
* 若对1加密后为k230101io934jksd32r4,说明如下:
* 前三位为随机数;
* 第四到第五位为要加密字符转换成16进制的位数,
* 如:要加密字符为15转换成16进制为f,位数为1,则第四、五位为01;
* 第六位标识要加密字符为何种字符,0:纯数字,1:字符
* 若是字符和数字的混合,则不加密;
* 从第七位开始为16进制转换后的字符(字母和非数字先转换成asc码);
* 若加密后的字符总位数不足20位,则用随机数补齐到20位,若超出20位,则不加随机数。
* 即加密后总位数至少为20位。
*/
public class EncryptionUtils {
private static String encode16(String str) {
str = str.toLowerCase();
if (!Pattern.matches("^[-\\+]?\\d+$", str)){//非整数字符,对每一个字符都转换成16进制,然后拼接
String[] s=str.split("");
String temp="";
for(int i=0;i<s.length;i++){
s[i]=stringToUnicode(s[i]);//先转换成Unicode编码
temp=temp+s[i];
}
return temp+":"+1;//1代表字符
}else{//数字直接转换成16进制
str=Integer.toHexString(Integer.valueOf(str));
// System.out.println("aa---->"+str);
return str+":"+0;//0代表纯数字
}
}
/**
* 字符串转unicode
*
* @param str
* @return
*/
private static String stringToUnicode(String str) {
StringBuffer sb = new StringBuffer();
char[] c = str.toCharArray();
for (int i = 0; i < c.length; i++) {
sb.append(Integer.toHexString(c[i]));
}
return sb.toString();
}
private static String produceRandom(int n){
String num="";
Random random = new Random();
for(int i=0;i<n;i++) {
num += random.nextInt(10);
}
return num;
}
//主加密函数
public static String encodeValue(String str){
String encryptStr="";//最终返回的加密后的字符串
encryptStr+=produceRandom(3);//产生3位随机数
String encode16 = encode16(str);
// System.out.println("----encode16----->"+encode16);
String[] temp = encode16.split(":");//对要加密的字符转换成16进制
int numLength=temp[0].length();//转换后的字符长度
String numLengthStr=Integer.toHexString(numLength);//字符长度换算成16进制
if(numLengthStr.length()==1){//如果是1,补一个0
numLengthStr="0"+numLengthStr;
}else if(numLengthStr.length()>2){//转换后的16进制字符长度如果大于2位数,则返回,不支持
return "";
}
encryptStr+=numLengthStr;
// System.out.println("encryptStr----->"+encryptStr);
if(temp[1].equals("0")){
encryptStr+="0";
}else if(temp[1].equals("1")){
encryptStr+="1";
}
// System.out.println("encryptStr----->"+encryptStr);
encryptStr+=temp[0];
// System.out.println("encryptStr----->"+encryptStr);
if(encryptStr.length()<20){//如果小于20位,补上随机数
String ran=produceRandom(20-encryptStr.length());
// System.out.println("补充的数字为"+ran);
encryptStr+=ran;
}
return encryptStr;
}
/*
解密为加密的逆过程
*/
public static String decodeValue(String value){
if(value.equals("")){
throw new NullPointerException();
}
if(value.length()<20){
throw new NullPointerException();
}
String charLength=value.substring(3, 5);//加密后的字符有多少位
int charLen=Integer.parseInt(charLength,16);//转换成10进制
int type=Integer.parseInt(value.substring(5, 6));//加密字符的类型(0:数字,1:字符串)
String valueEnc=value.substring(6, 6+charLen);//16进制字符串
if(type==0){
int trueValue=Integer.parseInt(valueEnc,16);
return String.valueOf(trueValue);
}else{
StringBuilder sb=new StringBuilder();
String[] valueEncArray=valueEnc.split("");
for(int i=0;i<valueEncArray.length-1;i+=2){
int value10=Integer.parseInt(valueEncArray[i]+valueEncArray[i+1],16);//转换成10进制的asc码
sb.append((char)value10);//asc码转换成字符
}
return sb.toString();
}
}
public static void main(String[] args) {
String str="123";
System.out.println(Pattern.matches("^[-\\+]?\\d+$", str));
String s = encodeValue(str);
System.out.println("加密结果------>"+s);
String decodeValue = decodeValue(s);
System.out.println("解密结果------>"+decodeValue);
}
}
对url路径中的参数进行加密--Java的更多相关文章
- CSS样式表、JS脚本加载顺序与SpringMVC在URL路径中传参数与SpringMVC 拦截器
CSS样式表和JS脚本加载顺序 Css样式表文件要在<head>中先加载,这样网页显示时可以第一次就渲染出正确的布局和样式,网页就不会闪烁,或跳变 JS脚本尽可能放在<body> ...
- 获取url路径中的参数
简介 运用js的时候,我们有时可能会有这样的需求,就是想要获取浏览器地址栏指定的一项参数,形如:https://i.cnblogs.com/EditPosts.aspx?postid=8628413& ...
- JS分页 + 获取MVC地址栏URL路径的最后参数
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...
- 使用JavaScript获取url(request)中的参数
这次是使用JavaScript来获取url(request)中的参数 在日常页面编写的过程中为了方便操作在<script>中通过使用window.location.href="要 ...
- 将map中的查询参数拼装到URL路径中
被调接口的URL路径: //被调接口url String apiUrl = "http://api.open.xxxxxx.com/implatform/interview/send?acc ...
- JavaScript------获取url地址中的参数
$(document).ready(function () { //获取地址中的参数(name是字符串) function getParameter(name) { //正则表达式 var reg = ...
- path-to-regexp快速拆分 url 路径中的参数信息
介绍一个小工具 path-to-regexp 用于快速拆解url path中的部分,贴别适合restful接口中快速获取对应的实体参数 git地址可以参考 https://github.com/pil ...
- 解决Java工程URL路径中含有中文的情况
问题: 当Java工程路径中含有中文时,得不到正确的路径 *** 解决: 这其实是编码转换的问题.当我们使用ClassLoader的getResource方法获取路径时,获取到的路径被URLEncod ...
- JS动态获取项目名以及获取URL地址中的参数
在项目当中我们可能会遇到例如改变的项目名称之后,相对应的地址就需要改变,为了减少工作量,将地址当中的项目名这一块写成动态获取的,那么最关键一点就是我要先获取它,再进行操作: 知识点整理,话不多说,直接 ...
随机推荐
- BJFU-206-基于顺序存储结构的图书信息表的修改
#include<stdio.h> #include<stdlib.h> #define MAX 1000 typedef struct{ double no; char na ...
- 修改织梦DedeCMS投票漏洞
织梦/dedecms系统我们都知道是有很多漏洞的,我在调试投票功能的时候正好要用到投票功能,这不就出现了漏洞,下面我就给大家展示如何修复这个织梦投票漏洞 首先我们打开//dedevote.class. ...
- 1010 Radix:猥琐的测试数据
谨以此题纪念边界测试数据浪费了我多少时间:https://pintia.cn/problem-sets/994805342720868352/problems/994805507225665536 # ...
- ideaui安装破解、相关配置、JRebel破解
前言: Ideaui 2019(官网 https://www.jetbrains.com/idea/?fromMenu) 安装软件就简单啦,下载选择路径就完事了,注意文件名全英文: 但是按照咱们传 ...
- Linux磁盘管理系列 — 磁盘配额管理
一.磁盘管理的概念 Linux系统是多用户任务操作系统,在使用系统时,会出现多用户共同使用一个磁盘的情况,如果其中少数几个用户占用了大量的磁盘空间,势必压缩其他用户的磁盘的空间和使用权限.因此,系统管 ...
- sublime text3 关闭更新提醒
Preferences->settings 在Preferences.sublime-setting --User中 增加: "update_check":false,
- robot framework 怎么验证搜索无记录,页面元素不存在
假设你要验证搜索无记录,页面元素不存在,假设我搜索的文本为你好 页面展示为如下 搜索:你好 假设页面搜索有结果: 你好 class=vtext 你好1 class=vtext 你好2 class ...
- Linux 之 文件
文件名称 在linux中,windows概念中的文件夹和文件是没有区别的,都是统称为文件. 1.Linux中文件的名称大小写是敏感的 2.名称最多可以为255个字符 3.除了正斜线以外,都是有效字符 ...
- 美化WebApi,使其统一返回Json格式
博客部分代码来自其他博主,暂时找不到你的博文连接,如果您觉得我的代码中引入了您的代码或者文章,可在下方把您的博客文章写在下面,谢谢!!! WebApi有两种返回数据格式,一种是XML,一种是Json, ...
- docker 运行没有权限执行文件解决
docker运行挂载主系统目录,导致无法启动configuration error: open /etc/docker/registry/config.yml: permission denied 提 ...