- 浏览: 1680389 次
- 性别:
- 来自: 杭州699号
文章分类
最新评论
-
莫莫摸:
为什么不用dubbo
RCP数据传输模型回顾 -
大胡子爸爸:
String, Class 都实现了Serializable接 ...
RPC框架几行代码就够了 -
lss598018587:
谢谢大神分享,比起新手看复杂的dubbo框架还不如看大神的这一 ...
RPC框架几行代码就够了 -
15606915740:
你好,请问一下。<dubbo:consumer filt ...
Dubbo文档 -
joqk12345:
...
一些设计上的基本常识
转于自己在公司的Blog:
http://pt.alibaba-inc.com/wp/experience_929/hessian-big-string-serialize-problems.html
网站出现比较奇怪的现象,线上总有些Offer信息反序化时出错,而测试环境却没有出现过,
通过远程调试线上环境,发现Hessian3.2.1在处理0x33标记时,会出错,跟进去发现:
Hessian3.2.1在处理大String时,以32k为一个块,最后一个不满32k的块分三种情况处理:
(1) 块大小为1到31个byte时:
用一个byte表示长度(一个byte最多表示31的长度),后面跟具体数据。
(2) 块大小为32到1023个byte时:
用两个byte表示长度,后面跟具体数据,因只需要高位byte的4个bit位,加低位byte就能够表示1023的长度,为了不浪费,高位byte的另外4个bit位被压缩用于flag。
(3) 块大小为1023到32k-1个byte时:
用’s’前缀标识为小块,进行块读取。
问题出在第二种情况,Hessian2Input没有还原压缩的4个bit位。
(1) 异常信息: (出错位置上的串已改为xxx表示)
(2) 问题代码: (Hessian2Input)
(3) 测试代码:
http://pt.alibaba-inc.com/wp/experience_929/hessian-big-string-serialize-problems.html
网站出现比较奇怪的现象,线上总有些Offer信息反序化时出错,而测试环境却没有出现过,
通过远程调试线上环境,发现Hessian3.2.1在处理0x33标记时,会出错,跟进去发现:
Hessian3.2.1在处理大String时,以32k为一个块,最后一个不满32k的块分三种情况处理:
(1) 块大小为1到31个byte时:
用一个byte表示长度(一个byte最多表示31的长度),后面跟具体数据。
(2) 块大小为32到1023个byte时:
用两个byte表示长度,后面跟具体数据,因只需要高位byte的4个bit位,加低位byte就能够表示1023的长度,为了不浪费,高位byte的另外4个bit位被压缩用于flag。
(3) 块大小为1023到32k-1个byte时:
用’s’前缀标识为小块,进行块读取。
问题出在第二种情况,Hessian2Input没有还原压缩的4个bit位。
(1) 异常信息: (出错位置上的串已改为xxx表示)
expected string at 0x33 java.lang.String (xxx) at com.caucho.hessian.io.Hessian2Input.error(Hessian2Input.java:2714) at com.caucho.hessian.io.Hessian2Input.expect(Hessian2Input.java:2685) at com.caucho.hessian.io.Hessian2Input.parseChar(Hessian2Input.java:2442) at com.caucho.hessian.io.Hessian2Input.readString(Hessian2Input.java:1285) at com.caucho.hessian.io.JavaDeserializer$StringFieldDeserializer.deserialize(JavaDeserializer.java:580) ... 21 more at com.caucho.hessian.io.JavaDeserializer.logDeserializeError(JavaDeserializer.java:671) at com.caucho.hessian.io.JavaDeserializer$StringFieldDeserializer.deserialize(JavaDeserializer.java:584) at com.caucho.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:233) at com.caucho.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:157) at com.caucho.hessian.io.Hessian2Input.readObjectInstance(Hessian2Input.java:2067) at com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:1592) at com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:1576) ... 14 more
(2) 问题代码: (Hessian2Input)
private int parseChar() throws IOException { while (_chunkLength <= 0) { if (_isLastChunk) return -1; int code = _offset < _length ? (_buffer[_offset++] & 0xff) : read(); switch (code) { case BC_STRING_CHUNK: _isLastChunk = false; _chunkLength = (read() << 8 ) + read(); break; case 'S': _isLastChunk = true; _chunkLength = (read() << 8 ) + read(); break; case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: _isLastChunk = true; _chunkLength = code - 0x00; break; // 问题所在,没有处理结尾块在1F到1K范围内时压缩的4个bit位 // 下面四行是新增的修复代码: case 0x30: case 0x31: case 0x32: case 0x33: _isLastChunk = true; _chunkLength = ((code - 0x30) << 8 ) + read(); break; default: throw expect("string", code); } } _chunkLength--; return parseUTF8Char(); }
(3) 测试代码:
public static void main(String[] args) throws IOException { test(1024 * 32); // OK test(1024 * 32 + 1); // OK test(1024 * 32 + 31); // OK test(1024 * 32 + 32); // ERROR test(1024 * 32 + 512); // ERROR test(1024 * 32 + 1023); // ERROR test(1024 * 33); // OK } public static void test(int size) throws IOException { SerializerFactory reponseSerializerFactory = new SerializerFactory(); StringBuilder buf = new StringBuilder(); for (int i = 0; i < size; i ++) { buf.append('A'); } String str = buf.toString(); System.out.println("length: " + str.getBytes().length); ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(2048); Hessian2Output hessianOutput = new Hessian2Output(byteBuffer); hessianOutput.setSerializerFactory(reponseSerializerFactory); hessianOutput.writeObject(str); hessianOutput.flush(); byte[] bytes = byteBuffer.toByteArray(); ByteArrayInputStream input = new ByteArrayInputStream(bytes); Hessian2Input hessianInput = new Hessian2Input(input); hessianInput.setSerializerFactory(reponseSerializerFactory); String result = (String)hessianInput.readObject(String.class); System.out.println("result: " + result); }
发表评论
-
能力成长模型
2012-05-09 00:28 22673最近看了温伯格1986年出版的《技术领导之路》, 很老的书,讲 ... -
以HTTL为例讲讲模块分包&领域模型&扩展框架
2011-10-09 20:08 16451注:该博客内容已加入 ... -
使用Map参数的Webx3扩展
2011-08-28 02:10 5854因Webx3是开源的,所以把这个简单的Webx3扩展发在博客上 ... -
Netty内存泄露
2011-08-02 20:09 24867转于自己在公司的Blog: ... -
Grizzly和Netty以及Mina简单性能对比
2011-07-17 02:48 29614转于自己在公司的Blog: http://pt.alibaba ... -
RPC框架几行代码就够了
2011-07-14 00:34 89501转于自己在公司的Blog: http://pt.alibaba ... -
魔鬼在细节中
2011-05-24 14:50 32255转于自己在公司的Blog: ... -
Dubbo扩展点重构
2011-05-12 22:09 38760转于自己在公司的Blog: http://pt.alibaba ... -
配置设计
2011-03-09 23:41 23432转于自己在公司的Blog: ... -
[转]HTML5设计原理
2011-03-09 22:57 7656Jeremy Keith在 Fronteers 2010 ... -
Hessian序列化不设SerializerFactory性能问题
2010-12-27 11:38 6382转于自己在公司的Blog: http://pt.alibaba ... -
动态代理方案性能对比
2010-11-17 21:38 45645转于自己在公司的Blog: http://pt.alibaba ... -
防痴呆设计
2010-11-05 18:58 17511转于自己在公司的Blog: ... -
负载均衡扩展接口重构
2010-11-05 18:53 8629转于自己在公司的Blog: ... -
分布式服务框架常被质疑的价值
2010-11-05 18:52 5677转于自己在公司的Blog: http://pt.alibaba ... -
一些设计上的基本常识
2010-07-05 19:28 27440转于自己在公司的Blog: ... -
谈谈扩充式扩展与增量式扩展
2010-06-12 19:46 18973转于自己在公司的Blog: http://pt.alibaba ... -
Scaling Architecture
2010-02-25 10:31 4053Scaling Second Life: http://p ... -
EBay SOA
2010-02-23 18:23 4736EBay SOA PPT -
服务化基础设施
2009-11-15 23:11 6216服务化,也可以叫SOA, ...
相关推荐
NULL 博文链接:https://qinghua0208.iteye.com/blog/493516
Hessian是一个轻量级的remotingonhttp工具,使用简单的方法提供了RMI的功能。相比Webservice,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合发送二进制数据。
介绍自己不会查吗?这里有一个点就是Hessian的序列化与反序列化与原生序列化与反序列化不同,就以使用的Resin链而言,其中的javax.naming.spi
NULL 博文链接:https://inter12.iteye.com/blog/1555678
com.alibaba:hessian-lite:jar:3.2.1-fixed-2 hessian-lite hessian-lite-3.2.1-fixed-2.jar
Hessian 2.0序列化协议规范
Hessian多个版本下载,包括Hessian3.1.6,Hessian3.2.1,Hessian4.0.7
hessian序列化.pdf
Nacos JRaft Hessian 反序列化 RCE 分析.pdf
NULL 博文链接:https://san-yun.iteye.com/blog/1688510
主要通过对二者简单的实现方式的对比,介绍了Java序列化和hessian序列化的差异,具有一定参考价值,需要的朋友可以了解下。
java hessian-3.0.38.jar。修改了原生的jar包,解决了hessian 序列化BigDecimal的精度问题。注意,请在hessian服务端和客户端中分别替换此jar包哦!! 只替换服务端hessian jar包还是会有问题。
hessian.jar,Hessian的序列化输出 ,
hessian轻量级 rpc实现
java运行依赖jar包
默认就是⾛ dubbo 协议,单⼀⻓连接,进⾏的是 NIO 异步通信,基于 hessian 作为序列化协议。使⽤的场景是:传输数据量⼩ (每次请求在 100kb 以内),但是并发量很⾼。 为了要⽀持⾼并发场景,⼀般是服务提供者就⼏...
a --args gadget入参,多个参数使用多次该命令传入,例-a -a Calc-p --protocol [dubbo|http] 通讯协议名称,默认缺省dubbo-s --serialization [hessian|java] 序列化类型,默认缺省hessian-t --target 目标,例:...
dubbo依赖的hessian-lite,版本号是3.2.1-fixed-2,通过下载该源码后,mvn install到本地,解决dubbo源码编译时依赖的hessian-lite的问题