需求:

后台对一些比较敏感的参数进行数据加密,然后在传送到前端。当前端跳转到后台时,再由后台对其进行解密。

参考 针对url参数的加密解密算法(java版)

修改:对中间的js页面加密代码改写为java

  1. package com.example.utils;
  2. import java.util.Random;
  3. import java.util.regex.Pattern;
  4. /*
  5. *功能:对url加密算法(只针对window.location.href跳转,不针对post表单提交及ajax方式)
  6. *算法:对于暴露在浏览器地址栏中的属性值进行加密,如一个属性为agentID=1,
  7. * 若对1加密后为k230101io934jksd32r4,说明如下:
  8. * 前三位为随机数;
  9. * 第四到第五位为要加密字符转换成16进制的位数,
  10. * 如:要加密字符为15转换成16进制为f,位数为1,则第四、五位为01;
  11. * 第六位标识要加密字符为何种字符,0:纯数字,1:字符
  12. * 若是字符和数字的混合,则不加密;
  13. * 从第七位开始为16进制转换后的字符(字母和非数字先转换成asc码);
  14. * 若加密后的字符总位数不足20位,则用随机数补齐到20位,若超出20位,则不加随机数。
  15. * 即加密后总位数至少为20位。
  16. */
  17. public class EncryptionUtils {
  18. private static String encode16(String str) {
  19. str = str.toLowerCase();
  20. if (!Pattern.matches("^[-\\+]?\\d+$", str)){//非整数字符,对每一个字符都转换成16进制,然后拼接
  21. String[] s=str.split("");
  22. String temp="";
  23. for(int i=0;i<s.length;i++){
  24. s[i]=stringToUnicode(s[i]);//先转换成Unicode编码
  25. temp=temp+s[i];
  26. }
  27. return temp+":"+1;//1代表字符
  28. }else{//数字直接转换成16进制
  29. str=Integer.toHexString(Integer.valueOf(str));
  30. // System.out.println("aa---->"+str);
  31. return str+":"+0;//0代表纯数字
  32. }
  33. }
  34. /**
  35. * 字符串转unicode
  36. *
  37. * @param str
  38. * @return
  39. */
  40. private static String stringToUnicode(String str) {
  41. StringBuffer sb = new StringBuffer();
  42. char[] c = str.toCharArray();
  43. for (int i = 0; i < c.length; i++) {
  44. sb.append(Integer.toHexString(c[i]));
  45. }
  46. return sb.toString();
  47. }
  48. private static String produceRandom(int n){
  49. String num="";
  50. Random random = new Random();
  51. for(int i=0;i<n;i++) {
  52. num += random.nextInt(10);
  53. }
  54. return num;
  55. }
  56. //主加密函数
  57. public static String encodeValue(String str){
  58. String encryptStr="";//最终返回的加密后的字符串
  59. encryptStr+=produceRandom(3);//产生3位随机数
  60. String encode16 = encode16(str);
  61. // System.out.println("----encode16----->"+encode16);
  62. String[] temp = encode16.split(":");//对要加密的字符转换成16进制
  63. int numLength=temp[0].length();//转换后的字符长度
  64. String numLengthStr=Integer.toHexString(numLength);//字符长度换算成16进制
  65. if(numLengthStr.length()==1){//如果是1,补一个0
  66. numLengthStr="0"+numLengthStr;
  67. }else if(numLengthStr.length()>2){//转换后的16进制字符长度如果大于2位数,则返回,不支持
  68. return "";
  69. }
  70. encryptStr+=numLengthStr;
  71. // System.out.println("encryptStr----->"+encryptStr);
  72. if(temp[1].equals("0")){
  73. encryptStr+="0";
  74. }else if(temp[1].equals("1")){
  75. encryptStr+="1";
  76. }
  77. // System.out.println("encryptStr----->"+encryptStr);
  78. encryptStr+=temp[0];
  79. // System.out.println("encryptStr----->"+encryptStr);
  80. if(encryptStr.length()<20){//如果小于20位,补上随机数
  81. String ran=produceRandom(20-encryptStr.length());
  82. // System.out.println("补充的数字为"+ran);
  83. encryptStr+=ran;
  84. }
  85. return encryptStr;
  86. }
  87. /*
  88. 解密为加密的逆过程
  89. */
  90. public static String decodeValue(String value){
  91. if(value.equals("")){
  92. throw new NullPointerException();
  93. }
  94. if(value.length()<20){
  95. throw new NullPointerException();
  96. }
  97. String charLength=value.substring(3, 5);//加密后的字符有多少位
  98. int charLen=Integer.parseInt(charLength,16);//转换成10进制
  99. int type=Integer.parseInt(value.substring(5, 6));//加密字符的类型(0:数字,1:字符串)
  100. String valueEnc=value.substring(6, 6+charLen);//16进制字符串
  101. if(type==0){
  102. int trueValue=Integer.parseInt(valueEnc,16);
  103. return String.valueOf(trueValue);
  104. }else{
  105. StringBuilder sb=new StringBuilder();
  106. String[] valueEncArray=valueEnc.split("");
  107. for(int i=0;i<valueEncArray.length-1;i+=2){
  108. int value10=Integer.parseInt(valueEncArray[i]+valueEncArray[i+1],16);//转换成10进制的asc码
  109. sb.append((char)value10);//asc码转换成字符
  110. }
  111. return sb.toString();
  112. }
  113. }
  114. public static void main(String[] args) {
  115. String str="123";
  116. System.out.println(Pattern.matches("^[-\\+]?\\d+$", str));
  117. String s = encodeValue(str);
  118. System.out.println("加密结果------>"+s);
  119. String decodeValue = decodeValue(s);
  120. System.out.println("解密结果------>"+decodeValue);
  121. }
  122. }

对url路径中的参数进行加密--Java的更多相关文章

  1. CSS样式表、JS脚本加载顺序与SpringMVC在URL路径中传参数与SpringMVC 拦截器

    CSS样式表和JS脚本加载顺序 Css样式表文件要在<head>中先加载,这样网页显示时可以第一次就渲染出正确的布局和样式,网页就不会闪烁,或跳变 JS脚本尽可能放在<body> ...

  2. 获取url路径中的参数

    简介 运用js的时候,我们有时可能会有这样的需求,就是想要获取浏览器地址栏指定的一项参数,形如:https://i.cnblogs.com/EditPosts.aspx?postid=8628413& ...

  3. JS分页 + 获取MVC地址栏URL路径的最后参数

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...

  4. 使用JavaScript获取url(request)中的参数

    这次是使用JavaScript来获取url(request)中的参数 在日常页面编写的过程中为了方便操作在<script>中通过使用window.location.href="要 ...

  5. 将map中的查询参数拼装到URL路径中

    被调接口的URL路径: //被调接口url String apiUrl = "http://api.open.xxxxxx.com/implatform/interview/send?acc ...

  6. JavaScript------获取url地址中的参数

    $(document).ready(function () { //获取地址中的参数(name是字符串) function getParameter(name) { //正则表达式 var reg = ...

  7. path-to-regexp快速拆分 url 路径中的参数信息

    介绍一个小工具 path-to-regexp 用于快速拆解url path中的部分,贴别适合restful接口中快速获取对应的实体参数 git地址可以参考 https://github.com/pil ...

  8. 解决Java工程URL路径中含有中文的情况

    问题: 当Java工程路径中含有中文时,得不到正确的路径 *** 解决: 这其实是编码转换的问题.当我们使用ClassLoader的getResource方法获取路径时,获取到的路径被URLEncod ...

  9. JS动态获取项目名以及获取URL地址中的参数

    在项目当中我们可能会遇到例如改变的项目名称之后,相对应的地址就需要改变,为了减少工作量,将地址当中的项目名这一块写成动态获取的,那么最关键一点就是我要先获取它,再进行操作: 知识点整理,话不多说,直接 ...

随机推荐

  1. golang中锁mutex的实现

    golang中的锁是通过CAS原子操作实现的,Mutex结构如下: type Mutex struct {     state int32                     sema  uint ...

  2. Spring AOP日志实现(二)--获取访问者IP及访问路径

    获取类及方法上的@RequestMapping注解: 应该是不等于: 获取访问者的ip地址,首先配置一个监听器: 配置完监听器后,就可以在类中注入一个HttpServletRequest: 获取ip:

  3. vs setup 自动下载依赖的framework配置

    1.项目->属性->签名->选中为ClickOnce清单签名->创建测试证书 2.项目->属性->安全性->启用ClickOnce安全设置 3.setup项目 ...

  4. python练习:面向对象1

    面向对象习题: 一:定义一个学生类.有下面的类属性: 1 姓名 2 年龄 3 成绩(语文,数学,英语)[每课成绩的类型为整数] 类方法: 1 获取学生的姓名:get_name() 返回类型:str 2 ...

  5. Python windows环境 搭建问题

    环境安装包下载地址: https://pan.baidu.com/s/1bnVhHMZ?fid=642139599707514 百度地址: http://sw.bos.baidu.com/sw-sea ...

  6. SqlServer2008 / SqlServer2012 禁用windows登录,sa忘记密码或密码过期如何登陆

    以管理员身份运行cmd 1.cmd 下  停止SqlServer服务,net stop mssqlserver: 2.新建windows账号test,加入administrators组里,授予管理员权 ...

  7. 预编译And作用域链

    首先要理解什么是预编译: 预编译就是在JS执行前的一瞬间创建一个AO对象,这个创建AO的过程叫做预编译. console.log(a) var a = 1; function c(b){ b = 10 ...

  8. Fortify漏洞之Open Redirect(开放式重定向)

    继续对Fortify的漏洞进行总结,本篇主要针对  Open Redirect(开放式重定向)  的漏洞进行总结,如下: 1.1.产生原因: 通过重定向,Web 应用程序能够引导用户访问同一应用程序内 ...

  9. [LeetCode] 671. 二叉树中第二小的节点 ☆(递归 合并)

    描述 给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0.如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值. 给出这样的一个二叉树,你需要输出所有 ...

  10. vue简单todolist

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...