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

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

2017-08-05 16:41 686 查看

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.运行界面:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: