您的位置:首页 > 编程语言 > Java开发

今天给大家介绍一下SpringBoot框架中URL参数如何进行Base64加密解密

2016-09-27 21:42 836 查看

今天给大家介绍一下SpringBoot框架中URL参数如何进行Base64加密解密

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

Java实现Base64有好多种方法,我这里就介绍其中的两种方法。要是大家有兴趣的话可以再去了解一下其他的几种方法,我这里就不多介绍了。
第一种方法:利用Java中sun.misc.BASE64Encoder()方法进行字符串编码,下面看具体实现例子:
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()方法进行字符串的编码工作。下面看具体例子:
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编码,解码文件代码:
/**
*
* 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>
<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参数的解码,下面看具体代码示例:
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.运行界面:





如果大家想要源代码或者对博客有啥异议都可以加我QQ:208017534  欢迎打扰哦!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: