springboot技术学习 https://www.itkc8.com
SpringBoot框架中URL参数如何进行Base64加密解密
首先给大家介绍一下Java中的Base64加密,其实Base64不是真正的加密,只是对字符串进行编码解码而已。主要作用是不让人一眼就可以看出字符串是什么值,有什么作用。
Java实现Base64有好多种方法,我这里就介绍其中的两种方法。要是大家有兴趣的话可以再去了解一下其他的几种方法,我这里就不多介绍了。
第一种方法:利用Java中sun.misc.BASE64Encoder()方法进行字符串编码,下面看具体实现例子:
[java] view plain copy
- package example.encrypt;
- import org.apache.commons.codec.binary.Base64;
- import org.springframework.util.Assert;
- import sun.plugin2.util.SystemUtil;
- import java.io.IOException;
- /**
- * Created by crj on 2016/9/27.
- */
- public class Base64Encrypt {
- /**
- * 编码
- *
- * @param bstr
- * @return String
- */
- public static String encode(byte[] bstr) {
- return new sun.misc.BASE64Encoder().encode(bstr);
- }
- /**
- * 解码
- *
- * @param str
- * @return string
- */
- public static byte[] decode(String str) {
- byte[] bt = null;
- try {
- sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
- bt = decoder.decodeBuffer(str);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return bt;
- }
- public static void main(String[] args) {
- String base64String = "whuang123";
- Base64Encrypt base64=new Base64Encrypt();
- String str1=base64.encode(base64String.getBytes());
- System.out.println("str1:"+str1);
- String str2=new String(base64.decode(str1));
- System.out.println("str2:"+str2);
- }
- }
第二种方法:利用Java中Base64.encodeBase64()方法进行字符串的编码工作。下面看具体例子:
[java] view plain copy
- package example.encrypt;
- import org.apache.commons.codec.binary.Base64;
- import org.springframework.util.Assert;
- import sun.plugin2.util.SystemUtil;
- import java.io.IOException;
- public class Base64Encrypt {
- public static void main(String[] args) {
- String base64String = "whuang123";
- byte[] result1= Base64.encodeBase64(base64String.getBytes());
- String str11=new String(result1);
- byte[] result2 = Base64.decodeBase64(result1);
- String str12=new String(result2);
- System.out.println(str11+"-------"+str12);
- }
- }
Java中对字符串的base64编码我就介绍这两种,其他的大家可以自己去搜索一下。
不过要实现URL参数加密单单在Java端进行字符串base64编码是不够的,还需要在在前台利用js实现base64编码才可以。
下面将给出一个例子:前台对URL参数进行base64编码,后台利用Java中Base64进行解码,并打印数据在界面上面。下面看具体代码的实现:
1.js中对字符串进行base64编码,解码文件代码:
[javascript] view plain copy
- /**
- *
- * Base64 encode / decode
- *
- * @author haitao.tu
- * @date 2010-04-26
- * @email tuhaitao@foxmail.com
- *
- */
- function Base64() {
- // private property
- _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
- // public method for encoding
- this.encode = function (input) {
- var output = "";
- var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
- var i = 0;
- input = _utf8_encode(input);
- while (i < input.length) {
- chr1 = input.charCodeAt(i++);
- chr2 = input.charCodeAt(i++);
- chr3 = input.charCodeAt(i++);
- enc1 = chr1 >> 2;
- enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
- enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
- enc4 = chr3 & 63;
- if (isNaN(chr2)) {
- enc3 = enc4 = 64;
- } else if (isNaN(chr3)) {
- enc4 = 64;
- }
- output = output +
- _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
- _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
- }
- return output;
- }
- // public method for decoding
- this.decode = function (input) {
- var output = "";
- var chr1, chr2, chr3;
- var enc1, enc2, enc3, enc4;
- var i = 0;
- input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
- while (i < input.length) {
- enc1 = _keyStr.indexOf(input.charAt(i++));
- enc2 = _keyStr.indexOf(input.charAt(i++));
- enc3 = _keyStr.indexOf(input.charAt(i++));
- enc4 = _keyStr.indexOf(input.charAt(i++));
- chr1 = (enc1 << 2) | (enc2 >> 4);
- chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
- chr3 = ((enc3 & 3) << 6) | enc4;
- output = output + String.fromCharCode(chr1);
- if (enc3 != 64) {
- output = output + String.fromCharCode(chr2);
- }
- if (enc4 != 64) {
- output = output + String.fromCharCode(chr3);
- }
- }
- output = _utf8_decode(output);
- return output;
- }
- // private method for UTF-8 encoding
- _utf8_encode = function (string) {
- string = string.replace(/\r\n/g,"\n");
- var utftext = "";
- for (var n = 0; n < string.length; n++) {
- var c = string.charCodeAt(n);
- if (c < 128) {
- utftext += String.fromCharCode(c);
- } else if((c > 127) && (c < 2048)) {
- utftext += String.fromCharCode((c >> 6) | 192);
- utftext += String.fromCharCode((c & 63) | 128);
- } else {
- utftext += String.fromCharCode((c >> 12) | 224);
- utftext += String.fromCharCode(((c >> 6) & 63) | 128);
- utftext += String.fromCharCode((c & 63) | 128);
- }
- }
- return utftext;
- }
- // private method for UTF-8 decoding
- _utf8_decode = function (utftext) {
- var string = "";
- var i = 0;
- var c = c1 = c2 = 0;
- while ( i < utftext.length ) {
- c = utftext.charCodeAt(i);
- if (c < 128) {
- string += String.fromCharCode(c);
- i++;
- } else if((c > 191) && (c < 224)) {
- c2 = utftext.charCodeAt(i+1);
- string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
- i += 2;
- } else {
- c2 = utftext.charCodeAt(i+1);
- c3 = utftext.charCodeAt(i+2);
- string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
- i += 3;
- }
- }
- return string;
- }
- }
2.创建一个base64.html页面,下面看具体代码实现:
[html] view plain copy
- <html>
- <head>
- <meta charset="utf-8"/>
- <title>base64加密</title>
- <script type="text/javascript" src="/MavenTest/js/base64.js"></script>
- <script type="text/javascript">
- var b = new Base64();
- var str1 = b.encode("admin");
- console.log("base64 encode"+str1);
- var str2 = b.encode("guangzhou");
- console.log("base64 encode"+str2);
- // //解密
- // str = b.decode(str);
- // console.log("base64 decode"+str);
- function buttonFuc() {
- var condition="name="+str1+"&address="+str2;
- window.location.href="/MavenTest/testpage/base64test?"+condition;
- };
- </script>
- </head>
- <button onclick="buttonFuc()">click me will format into new html</button>
- <body>
- </body>
- </html>
3.在控制器中实现URL参数的解码,下面看具体代码示例:
[java] view plain copy
- package example.controller;
- import org.apache.catalina.connector.Request;
- import org.apache.commons.codec.binary.Base64;
- import org.apache.commons.lang3.StringEscapeUtils;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
- import javax.servlet.http.HttpServletRequest;
- import java.util.Iterator;
- import java.util.Map;
- import java.util.Set;
- @Controller
- @RequestMapping("/testpage")
- public class TestController {
- @RequestMapping("/Base64")
- public String base64(){
- return "testpage/Base64";
- }
- @RequestMapping("/base64test")
- @ResponseBody
- public String base64test(HttpServletRequest request){
- String address=request.getParameter("amp;address");
- String name=request.getParameter("name");
- String convStr = StringEscapeUtils.unescapeHtml4("&name=1009");
- System.out.println("base64传输前");
- System.out.println("name:"+name+" address:"+address);
- System.out.println("base64取值后");
- byte[] result1 = Base64.decodeBase64(name);
- byte[] result2 = Base64.decodeBase64(address);
- String str1=new String(result1);
- String str2=new String(result2);
- System.out.println("name:"+str1+" address:"+str2);
- String result="name:"+str1+" address:"+str2;
- return result;
- }
- }
这里有个问个要和大家解释一下,就是在window.location.href中&需要转义成&否则编译通不过。因为我用的是SpringBoot框架,但是不知道要如何实现对转义的URL进行参数获取。所以我只能利用传统的getParameter方法进行获取了。如果有谁知道SpringBoot中怎么对URL转义词进行反转,例如把&变成&。请一定要告诉我,谢谢呀!!
4.运行界面:
springboot技术学习 https://www.itkc8.com