`

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
分享到:
评论

相关推荐

    解析URL和文件的编码方式

    在IT行业中,编码方式是构建网络通信和存储数据的基础,特别是在处理URL(统一资源定位符)和文件时。本文将深入解析URL和文件的编码方式,以帮助理解这些概念及其在实际工作中的应用。 首先,URL是互联网上访问...

    Java网络传输中字符编码问题的研究

    Java网络传输中的字符编码问题主要涉及到Java编程语言在处理不同编码格式时的转换和兼容性。Java语言本身采用Unicode字符集,这是一种国际化的标准,能够支持世界上大多数语言,包括中文。然而,在实际的网络环境中...

    Java字符集和编码

    ASCII编码(American Standard Code for Information Interchange,美国标准信息交换码)是由美国国家标准局(ANSI)制定的一种编码方式。它已被国际标准化组织(ISO)采纳为国际标准,即ISO 646标准。该标准主要适用...

    常用编码方式及其格式转换

    ### 常用编码方式及其格式转换 #### 引言 在信息技术日新月异的今天,信息的跨平台交流已成为常态。然而,不同信息平台采用的字符编码方式各异,导致了信息在传输过程中可能出现的乱码或无法读取的问题。这是因为...

    java编码总结1

    在日常开发中,我们经常会遇到编码问题,比如在处理用户输入、网络数据传输或者集成不同系统的接口时。这时,我们需要了解并使用`Charset`类来操作字符集,`InputStreamReader`和`OutputStreamWriter`用于将字节流...

    常用的java汉字unicode编码

    在IT领域,尤其是在Java编程中,Unicode编码是一个极为重要的概念,它确保了全球各种语言的文字能够在计算机系统中正确地表示、存储和传输。Unicode是一种国际化的字符编码标准,旨在为世界上所有的字符提供唯一的...

    Java基于Base64实现编码解码图片文件

    "Java基于Base64实现编码解码图片文件" Java基于Base64实现编码解码图片文件是Java语言...Java基于Base64实现编码解码图片文件是一种常见的编码解码实现方式,广泛应用于数据传输和存储,但需要注意其安全性和可靠性。

    深入分析Java中的中文编码问题

    - **UTF-8**:这是一种可变长度的编码方式,可以很好地支持Unicode标准,广泛应用于互联网中。 - **UTF-16**:也是一种支持Unicode的标准,使用固定长度的两个字节来表示字符,Java内部使用此编码。 ##### 2.2 编码...

    java_各种编码转换源代码

    在Java中,字符集主要基于Unicode,其中最常用的是UTF-8,它是一种可变长度的编码方式,能够表示几乎所有的世界语言字符。 在处理文本数据时,我们可能会遇到不同的编码格式,例如GBK、ISO-8859-1等。如果不正确地...

    java字符集编码问题

    UTF(Unicode Transformation Format)是一种可变长度的编码方式,用于提高Unicode的存储效率。其中最常用的是UTF-8,它可以兼容ASCII,并且对于英文字符只需一个字节表示,对于其他语言字符则使用1到4个字节不等。...

    JAVA将图片转换为Base64编码

    Base64编码是一种常用的数据编码方式,广泛应用于网络传输、数据存储等领域。下面我们将详细介绍如何使用Java实现图片到Base64编码的转换。 为什么需要Base64编码 在网络传输和数据存储中,图片是一种二进制数据,...

    环保212协议解析java

    该协议定义了环境监测数据的结构、编码规则以及传输方式,确保不同厂商的设备能有效地共享和传递监测信息,如空气质量、水质、噪声等环境参数。 在Java编程环境中,解析环保212协议通常涉及到以下几个关键知识点: ...

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

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

    js解码 、java编码

    其中,Base64是一种常用的编码方式,用于将二进制数据转换为ASCII字符串,以便在网络上传输。在给定的`Base64.js`文件中,很可能包含了用于Base64编码和解码的函数或类。Base64解码通常用于处理例如图片、音频等二...

    Java 编码解码

    这些操作在处理不同语言、不同系统间的数据传输时尤为重要,因为不同的系统可能使用不同的字符编码标准。 Java提供了丰富的类库来支持各种编码和解码操作,主要位于`java.nio.charset`包下。最常用的编码格式包括...

    Java中编码总结[整理].pdf

    在这个总结中,我们将深入探讨基本的编码概念,以及与Java编程相关的字符集和编码方式。 首先,我们来理解基本的位(bit)和字节(byte)的概念。位是计算机中最基本的存储单位,只能取0或1两个值。而字节由8个位组成,...

    Java企业级开发综合技能知识总结

    ### Java企业级开发综合技能知识总结 #### Java面向对象 1. **super()与this()的区别?** - `super()`用于调用父类构造器,必须作为子类构造器的第一条语句出现。 - `this()`用于调用本类的其他构造器,也必须...

    Java实现的Base64编码程序

    Base64是一种将二进制数据转换为可打印ASCII字符的编码方式,广泛应用于网络传输、数据存储等领域。在Java中实现Base64编码,我们可以使用内置的`java.util.Base64`类,这个类提供了方便的方法来进行Base64的编码和...

    JAVA及相关字符集编码问题

    UTF-8的优势在于其可变长度的编码方式,既能高效地表示英文等ASCII字符,又能很好地支持其他语言的字符。 在Java中,处理字符集编码的关键方法有: 1. `getBytes(String charset)` 该方法用于将字符串转换为指定...

    java如何正确使用字体编码

    它是互联网上最常用的编码方式之一。 2. **ISO-8859-1**:也称为Latin-1,是一种单字节编码方案,主要支持西欧语言。 3. **GBK**:是简体中文的一种编码标准,兼容GB2312标准,并且包含更多汉字及符号。 #### 二、...

Global site tag (gtag.js) - Google Analytics