SpringBoot框架中URL参数如何进行Base64加密解密

springboot技术学习 https://www.itkc8.com

SpringBoot框架中URL参数如何进行Base64加密解密

首先给大家介绍一下Java中的Base64加密,其实Base64不是真正的加密,只是对字符串进行编码解码而已。主要作用是不让人一眼就可以看出字符串是什么值,有什么作用。

 

Java实现Base64有好多种方法,我这里就介绍其中的两种方法。要是大家有兴趣的话可以再去了解一下其他的几种方法,我这里就不多介绍了。

第一种方法:利用Java中sun.misc.BASE64Encoder()方法进行字符串编码,下面看具体实现例子:

[java] view plain copy

  1. package example.encrypt;  
  2.   
  3. import org.apache.commons.codec.binary.Base64;  
  4. import org.springframework.util.Assert;  
  5. import sun.plugin2.util.SystemUtil;  
  6.   
  7. import java.io.IOException;  
  8.   
  9. /** 
  10.  * Created by crj on 2016/9/27. 
  11.  */  
  12. public class Base64Encrypt {  
  13.     /** 
  14.      * 编码 
  15.      * 
  16.      * @param bstr 
  17.      * @return String 
  18.      */  
  19.     public static String encode(byte[] bstr) {  
  20.         return new sun.misc.BASE64Encoder().encode(bstr);  
  21.     }  
  22.   
  23.     /** 
  24.      * 解码 
  25.      * 
  26.      * @param str 
  27.      * @return string 
  28.      */  
  29.     public static byte[] decode(String str) {  
  30.         byte[] bt = null;  
  31.         try {  
  32.             sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();  
  33.             bt = decoder.decodeBuffer(str);  
  34.         } catch (IOException e) {  
  35.             e.printStackTrace();  
  36.         }  
  37.   
  38.         return bt;  
  39.     }  
  40.   
  41.     public static void main(String[] args) {  
  42.         String base64String = "whuang123";  
  43.         Base64Encrypt base64=new Base64Encrypt();  
  44.        String str1=base64.encode(base64String.getBytes());  
  45.         System.out.println("str1:"+str1);  
  46.         String str2=new String(base64.decode(str1));  
  47.         System.out.println("str2:"+str2);  
  48.     }  
  49. }  

第二种方法:利用Java中Base64.encodeBase64()方法进行字符串的编码工作。下面看具体例子:

[java] view plain copy

  1. package example.encrypt;  
  2. import org.apache.commons.codec.binary.Base64;  
  3. import org.springframework.util.Assert;  
  4. import sun.plugin2.util.SystemUtil;  
  5. import java.io.IOException;  
  6. public class Base64Encrypt {  
  7.     public static void main(String[] args) {  
  8.         String base64String = "whuang123";  
  9.         byte[] result1= Base64.encodeBase64(base64String.getBytes());  
  10.         String str11=new String(result1);  
  11.         byte[] result2 = Base64.decodeBase64(result1);  
  12.         String str12=new String(result2);  
  13.         System.out.println(str11+"-------"+str12);  
  14.     }  
  15. }  

Java中对字符串的base64编码我就介绍这两种,其他的大家可以自己去搜索一下。

不过要实现URL参数加密单单在Java端进行字符串base64编码是不够的,还需要在在前台利用js实现base64编码才可以。

下面将给出一个例子:前台对URL参数进行base64编码,后台利用Java中Base64进行解码,并打印数据在界面上面。下面看具体代码的实现:

1.js中对字符串进行base64编码,解码文件代码:

[javascript] view plain copy

  1. /** 
  2.  * 
  3.  * Base64 encode / decode 
  4.  * 
  5.  * @author haitao.tu 
  6.  * @date 2010-04-26 
  7.  * @email tuhaitao@foxmail.com 
  8.  * 
  9.  */  
  10. function Base64() {  
  11.  // private property  
  12.  _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";  
  13.  // public method for encoding  
  14.  this.encode = function (input) {  
  15.   var output = "";  
  16.   var chr1, chr2, chr3, enc1, enc2, enc3, enc4;  
  17.   var i = 0;  
  18.   input = _utf8_encode(input);  
  19.   while (i < input.length) {  
  20.    chr1 = input.charCodeAt(i++);  
  21.    chr2 = input.charCodeAt(i++);  
  22.    chr3 = input.charCodeAt(i++);  
  23.    enc1 = chr1 >> 2;  
  24.    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);  
  25.    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);  
  26.    enc4 = chr3 & 63;  
  27.    if (isNaN(chr2)) {  
  28.     enc3 = enc4 = 64;  
  29.    } else if (isNaN(chr3)) {  
  30.     enc4 = 64;  
  31.    }  
  32.    output = output +  
  33.        _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +  
  34.        _keyStr.charAt(enc3) + _keyStr.charAt(enc4);  
  35.   }  
  36.   return output;  
  37.  }  
  38.  // public method for decoding  
  39.  this.decode = function (input) {  
  40.   var output = "";  
  41.   var chr1, chr2, chr3;  
  42.   var enc1, enc2, enc3, enc4;  
  43.   var i = 0;  
  44.   input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");  
  45.   while (i < input.length) {  
  46.    enc1 = _keyStr.indexOf(input.charAt(i++));  
  47.    enc2 = _keyStr.indexOf(input.charAt(i++));  
  48.    enc3 = _keyStr.indexOf(input.charAt(i++));  
  49.    enc4 = _keyStr.indexOf(input.charAt(i++));  
  50.    chr1 = (enc1 << 2) | (enc2 >> 4);  
  51.    chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);  
  52.    chr3 = ((enc3 & 3) << 6) | enc4;  
  53.    output = output + String.fromCharCode(chr1);  
  54.    if (enc3 != 64) {  
  55.     output = output + String.fromCharCode(chr2);  
  56.    }  
  57.    if (enc4 != 64) {  
  58.     output = output + String.fromCharCode(chr3);  
  59.    }  
  60.   }  
  61.   output = _utf8_decode(output);  
  62.   return output;  
  63.  }  
  64.  // private method for UTF-8 encoding  
  65.  _utf8_encode = function (string) {  
  66.   string = string.replace(/\r\n/g,"\n");  
  67.   var utftext = "";  
  68.   for (var n = 0; n < string.length; n++) {  
  69.    var c = string.charCodeAt(n);  
  70.    if (c < 128) {  
  71.     utftext += String.fromCharCode(c);  
  72.    } else if((c > 127) && (c < 2048)) {  
  73.     utftext += String.fromCharCode((c >> 6) | 192);  
  74.     utftext += String.fromCharCode((c & 63) | 128);  
  75.    } else {  
  76.     utftext += String.fromCharCode((c >> 12) | 224);  
  77.     utftext += String.fromCharCode(((c >> 6) & 63) | 128);  
  78.     utftext += String.fromCharCode((c & 63) | 128);  
  79.    }  
  80.   }  
  81.   return utftext;  
  82.  }  
  83.  // private method for UTF-8 decoding  
  84.  _utf8_decode = function (utftext) {  
  85.   var string = "";  
  86.   var i = 0;  
  87.   var c = c1 = c2 = 0;  
  88.   while ( i < utftext.length ) {  
  89.    c = utftext.charCodeAt(i);  
  90.    if (c < 128) {  
  91.     string += String.fromCharCode(c);  
  92.     i++;  
  93.    } else if((c > 191) && (c < 224)) {  
  94.     c2 = utftext.charCodeAt(i+1);  
  95.     string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));  
  96.     i += 2;  
  97.    } else {  
  98.     c2 = utftext.charCodeAt(i+1);  
  99.     c3 = utftext.charCodeAt(i+2);  
  100.     string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));  
  101.     i += 3;  
  102.    }  
  103.   }  
  104.   return string;  
  105.  }  
  106. }  

2.创建一个base64.html页面,下面看具体代码实现:

[html] view plain copy

  1. <html>  
  2. <head>  
  3.     <meta charset="utf-8"/>  
  4.     <title>base64加密</title>  
  5.     <script type="text/javascript" src="/MavenTest/js/base64.js"></script>  
  6.     <script type="text/javascript">  
  7.         var b = new Base64();  
  8.         var str1 = b.encode("admin");  
  9.         console.log("base64 encode"+str1);  
  10.         var str2 = b.encode("guangzhou");  
  11.         console.log("base64 encode"+str2);  
  12. //        //解密  
  13. //        str = b.decode(str);  
  14. //        console.log("base64 decode"+str);  
  15.         function buttonFuc() {  
  16.             var condition="name="+str1+"&amp;address="+str2;  
  17.             window.location.href="/MavenTest/testpage/base64test?"+condition;  
  18.         };  
  19.     </script>  
  20. </head>  
  21. <button onclick="buttonFuc()">click me will format into new html</button>  
  22. <body>  
  23. </body>  
  24. </html>  

3.在控制器中实现URL参数的解码,下面看具体代码示例:

[java] view plain copy

  1. package example.controller;  
  2. import org.apache.catalina.connector.Request;  
  3. import org.apache.commons.codec.binary.Base64;  
  4. import org.apache.commons.lang3.StringEscapeUtils;  
  5. import org.springframework.stereotype.Controller;  
  6. import org.springframework.web.bind.annotation.RequestMapping;  
  7. import org.springframework.web.bind.annotation.ResponseBody;  
  8.   
  9. import javax.servlet.http.HttpServletRequest;  
  10. import java.util.Iterator;  
  11. import java.util.Map;  
  12. import java.util.Set;  
  13.   
  14. @Controller  
  15. @RequestMapping("/testpage")  
  16. public class TestController {  
  17.     @RequestMapping("/Base64")  
  18.     public String base64(){  
  19.         return "testpage/Base64";  
  20.     }  
  21.     @RequestMapping("/base64test")  
  22.     @ResponseBody  
  23.     public String base64test(HttpServletRequest request){  
  24.         String address=request.getParameter("amp;address");  
  25.         String name=request.getParameter("name");  
  26.         String convStr = StringEscapeUtils.unescapeHtml4("&name=1009");  
  27.         System.out.println("base64传输前");  
  28.         System.out.println("name:"+name+"   address:"+address);  
  29.         System.out.println("base64取值后");  
  30.         byte[] result1 = Base64.decodeBase64(name);  
  31.         byte[] result2 = Base64.decodeBase64(address);  
  32.         String str1=new String(result1);  
  33.         String str2=new String(result2);  
  34.         System.out.println("name:"+str1+"   address:"+str2);  
  35.         String result="name:"+str1+"   address:"+str2;  
  36.         return result;  
  37.     }  
  38. }  

这里有个问个要和大家解释一下,就是在window.location.href中&需要转义成&amp;否则编译通不过。因为我用的是SpringBoot框架,但是不知道要如何实现对转义的URL进行参数获取。所以我只能利用传统的getParameter方法进行获取了。如果有谁知道SpringBoot中怎么对URL转义词进行反转,例如把&amp;变成&。请一定要告诉我,谢谢呀!!

4.运行界面:

 

springboot技术学习 https://www.itkc8.com

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值