`

java数据传输常用编码方式总结

 
阅读更多

在开发中常常遇到一种场景,一个系统向另一个系统提交数据的时候,可能是通过json方式提交,也可能先写到html页面的form表单里面提交,这样就会带来几个问题,比如,json格式里面含有疑似XSS攻击的恶意字符串,或者含有与HTML语义相同的标签字符。

在这种情况下,就需要对所提交的字符串进行编码了。然后接收方进行解码。

 

编码的常见方式总结如下:

一、unicode编码

 

        //import org.apache.commons.lang.StringEscapeUtils;
 
        String test="我是中国人()(),,<br>\",.<script><tablke>";
       
        String encoderJava=StringEscapeUtils.escapeJava(test);
        String unencoderJava=StringEscapeUtils.unescapeJava(encoderJava);
        System.out.println(encoderJava);
        System.out.println(unencoderJava);
        System.out.println("---------------------------------------------------------");



结果:
\u6211\u662F\u4E2D\u56FD\u4EBA()\uFF08\uFF09\uFF0C,<br>\",.<script><tablke>
我是中国人()(),,<br>",.<script><tablke>

 

 

二、Base64与Base32

       
        //import org.apache.commons.codec.binary.Base64;

        byte[] base64=Base64.encodeBase64(test.getBytes());
        String base64Str=new String(base64);
        byte[] decodeBase64= Base64.decodeBase64(base64Str);
        String decodeBase64Str=new String(decodeBase64);
        System.out.println(base64Str);
        System.out.println(decodeBase64Str);


结果:
5oiR5piv5Lit5Zu95Lq6KCnvvIjvvInvvIwsPGJyPiIsLjxzY3JpcHQ+PHRhYmxrZT4=
我是中国人()(),,<br>",.<script><tablke>

 

    Base32类似

 

三、只针对html字符转义的编码

 

这里有两个包提供了html的转义编码功能,但是差别很大

分别是org.apache.commons.lang.StringEscapeUtils;  与org.springframework.web.util.HtmlUtils;

 

先看StringEscapeUtils,如下:

 String encoderHtml=StringEscapeUtils.escapeHtml(test);
        String unencoderHtml=StringEscapeUtils.unescapeHtml(encoderHtml);
        System.out.println(encoderHtml);
        System.out.println(unencoderHtml);
        System.out.println("---------------------------------------------------------");


结果:
&#25105;&#26159;&#20013;&#22269;&#20154;()&#65288;&#65289;&#65292;,&lt;br&gt;&quot;,.&lt;script&gt;&lt;tablke&gt;
我是中国人()(),,<br>",.<script><tablke>

 

   再看HtmlUtils的效果:

  

String springEncodeHtml=HtmlUtils.htmlEscape(test);
        String unspringEncodeHtml=HtmlUtils.htmlUnescape(springEncodeHtml);
        System.out.println(springEncodeHtml);
        System.out.println(unspringEncodeHtml);


结果:

我是中国人()(),,&lt;br&gt;&quot;,.&lt;script&gt;&lt;tablke&gt;
我是中国人()(),,<br>",.<script><tablke>

 

 

四、url编码

这里使用commons-codec包提供的功能

 byte[] url=URLCodec.encodeUrl(new BitSet(),test.getBytes());
        byte[] decodeUrl=URLCodec.decodeUrl(url);
        String urlStr=new String(url);
        String decodeUrlStr=new String(decodeUrl);
        System.out.println(urlStr);
        System.out.println(decodeUrlStr);



结果:
5oiR5piv5Lit5Zu95Lq6KCnvvIjvvInvvIwsPGJyPiIsLjxzY3JpcHQ+PHRhYmxrZT4=
我是中国人()(),,<br>",.<script><tablke>

 

 

 

 

五、其他编码方式(http://commons.apache.org/proper/commons-codec)

commons-codec 还提供了很多其他的编码方式,这里列出一种。

 byte[] qByte=QuotedPrintableCodec.encodeQuotedPrintable(new BitSet(),test.getBytes());
        byte[] dByte=QuotedPrintableCodec.decodeQuotedPrintable(qByte);
        String qByteStr=new String(qByte);
        String dByteStr=new String(dByte);
        System.out.println(qByteStr);
        System.out.println(dByteStr);


结果:
%E6%88%91%E6%98%AF%E4%B8%AD%E5%9B%BD%E4%BA%BA%28%29%EF%BC%88%EF%BC%89%EF%BC%8C%2C%3C%62%72%3E%22%2C%2E%3C%73%63%72%69%70%74%3E%3C%74%61%62%6C%6B%65%3E
我是中国人()(),,<br>",.<script><tablke>

 

 

通过以上五种编码方式,发现不满足我需求的除了第一种和第三种里面的HtmlUtils之外,其余都满足我的需求。编码后字符长度最小的是第二种和第三种里面的StringEscapeUtils

 

另:我希望找到一种这样的编码方式,提交请求对方接受后,不需要转码就能使用。有吗?

org.springframework.web.util.HtmlUtils; 提供的编码方式仅仅将HTML字符进行了转义,HTML转义字符push到页面后,提交到后台,后台通过request.getParameter获取,并不需要对获取到的数据进行解码。浏览器能自动解码。这个例子与浏览器URL字符串自动对中文进行编码解码原理类似

 

举例如下:

    jdjg<input id ="">  转码后为 jdjg&lt;input id =&quot;&quot;&gt;此时HTML源码如下:

 value="jdjg&lt;input id =&quot;&quot;&gt;" >

   

    页面展示效果为:

   

     实际后台获取到的值为:

     jdjg<input id ="">

     

 

 

 

 

  • 大小: 946 Bytes
  • 大小: 2.9 KB
分享到:
评论

相关推荐

    Java Base64编码方法详解及实例分析

    总之,Base64编码是网络传输中常用的数据编码方式,它可以将二进制数据转换成可打印的ASCII字符串,确保数据在传输过程中的安全性。Base64.encodeBase64String方法是Java中进行Base64编码的一种便捷实现,能够轻松地...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA_API1.6文档(中文)

    java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包4

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包3

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java 面试题 总结

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...

    Java 1.6 API 中文 New

    java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示...

    java源码包2

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java开源包11

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包6

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包4

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包9

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包101

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包5

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    GSM-PDU模式短信编解码-java代码

    项目中用到了AT指令中的GSM短信息的收发,上网找的代码大多都是C或者C++语言编写...4、代码中实现了PDU模式下7bit编码和UCS2编码这两种常用编码方式下的数据编码与解码 5、代码中实现了对信息中是否包含中文字符的判断

    java开源包8

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包10

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java api最新7.0

    java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示...

Global site tag (gtag.js) - Google Analytics