在开发中常常遇到一种场景,一个系统向另一个系统提交数据的时候,可能是通过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("---------------------------------------------------------"); 结果: 我是中国人()(),,<br>",.<script><tablke> 我是中国人()(),,<br>",.<script><tablke>
再看HtmlUtils的效果:
String springEncodeHtml=HtmlUtils.htmlEscape(test); String unspringEncodeHtml=HtmlUtils.htmlUnescape(springEncodeHtml); System.out.println(springEncodeHtml); System.out.println(unspringEncodeHtml); 结果: 我是中国人()(),,<br>",.<script><tablke> 我是中国人()(),,<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<input id ="">此时HTML源码如下:
value="jdjg<input id ="">" >
页面展示效果为:
实际后台获取到的值为:
jdjg<input id ="">
相关推荐
在IT行业中,编码方式是构建网络通信和存储数据的基础,特别是在处理URL(统一资源定位符)和文件时。本文将深入解析URL和文件的编码方式,以帮助理解这些概念及其在实际工作中的应用。 首先,URL是互联网上访问...
Java网络传输中的字符编码问题主要涉及到Java编程语言在处理不同编码格式时的转换和兼容性。Java语言本身采用Unicode字符集,这是一种国际化的标准,能够支持世界上大多数语言,包括中文。然而,在实际的网络环境中...
ASCII编码(American Standard Code for Information Interchange,美国标准信息交换码)是由美国国家标准局(ANSI)制定的一种编码方式。它已被国际标准化组织(ISO)采纳为国际标准,即ISO 646标准。该标准主要适用...
### 常用编码方式及其格式转换 #### 引言 在信息技术日新月异的今天,信息的跨平台交流已成为常态。然而,不同信息平台采用的字符编码方式各异,导致了信息在传输过程中可能出现的乱码或无法读取的问题。这是因为...
在日常开发中,我们经常会遇到编码问题,比如在处理用户输入、网络数据传输或者集成不同系统的接口时。这时,我们需要了解并使用`Charset`类来操作字符集,`InputStreamReader`和`OutputStreamWriter`用于将字节流...
在IT领域,尤其是在Java编程中,Unicode编码是一个极为重要的概念,它确保了全球各种语言的文字能够在计算机系统中正确地表示、存储和传输。Unicode是一种国际化的字符编码标准,旨在为世界上所有的字符提供唯一的...
"Java基于Base64实现编码解码图片文件" Java基于Base64实现编码解码图片文件是Java语言...Java基于Base64实现编码解码图片文件是一种常见的编码解码实现方式,广泛应用于数据传输和存储,但需要注意其安全性和可靠性。
- **UTF-8**:这是一种可变长度的编码方式,可以很好地支持Unicode标准,广泛应用于互联网中。 - **UTF-16**:也是一种支持Unicode的标准,使用固定长度的两个字节来表示字符,Java内部使用此编码。 ##### 2.2 编码...
在Java中,字符集主要基于Unicode,其中最常用的是UTF-8,它是一种可变长度的编码方式,能够表示几乎所有的世界语言字符。 在处理文本数据时,我们可能会遇到不同的编码格式,例如GBK、ISO-8859-1等。如果不正确地...
UTF(Unicode Transformation Format)是一种可变长度的编码方式,用于提高Unicode的存储效率。其中最常用的是UTF-8,它可以兼容ASCII,并且对于英文字符只需一个字节表示,对于其他语言字符则使用1到4个字节不等。...
Base64编码是一种常用的数据编码方式,广泛应用于网络传输、数据存储等领域。下面我们将详细介绍如何使用Java实现图片到Base64编码的转换。 为什么需要Base64编码 在网络传输和数据存储中,图片是一种二进制数据,...
该协议定义了环境监测数据的结构、编码规则以及传输方式,确保不同厂商的设备能有效地共享和传递监测信息,如空气质量、水质、噪声等环境参数。 在Java编程环境中,解析环保212协议通常涉及到以下几个关键知识点: ...
项目中用到了AT指令中的GSM短信息的收发,上网找的代码大多都是C或者C++语言编写...4、代码中实现了PDU模式下7bit编码和UCS2编码这两种常用编码方式下的数据编码与解码 5、代码中实现了对信息中是否包含中文字符的判断
其中,Base64是一种常用的编码方式,用于将二进制数据转换为ASCII字符串,以便在网络上传输。在给定的`Base64.js`文件中,很可能包含了用于Base64编码和解码的函数或类。Base64解码通常用于处理例如图片、音频等二...
这些操作在处理不同语言、不同系统间的数据传输时尤为重要,因为不同的系统可能使用不同的字符编码标准。 Java提供了丰富的类库来支持各种编码和解码操作,主要位于`java.nio.charset`包下。最常用的编码格式包括...
在这个总结中,我们将深入探讨基本的编码概念,以及与Java编程相关的字符集和编码方式。 首先,我们来理解基本的位(bit)和字节(byte)的概念。位是计算机中最基本的存储单位,只能取0或1两个值。而字节由8个位组成,...
### Java企业级开发综合技能知识总结 #### Java面向对象 1. **super()与this()的区别?** - `super()`用于调用父类构造器,必须作为子类构造器的第一条语句出现。 - `this()`用于调用本类的其他构造器,也必须...
Base64是一种将二进制数据转换为可打印ASCII字符的编码方式,广泛应用于网络传输、数据存储等领域。在Java中实现Base64编码,我们可以使用内置的`java.util.Base64`类,这个类提供了方便的方法来进行Base64的编码和...
UTF-8的优势在于其可变长度的编码方式,既能高效地表示英文等ASCII字符,又能很好地支持其他语言的字符。 在Java中,处理字符集编码的关键方法有: 1. `getBytes(String charset)` 该方法用于将字符串转换为指定...
它是互联网上最常用的编码方式之一。 2. **ISO-8859-1**:也称为Latin-1,是一种单字节编码方案,主要支持西欧语言。 3. **GBK**:是简体中文的一种编码标准,兼容GB2312标准,并且包含更多汉字及符号。 #### 二、...