Hessian协议的使用
Hessian加密传输

由于项目需要需要研究下hessian的加密传输。
于是翻出hessian源码,发现com.caucho.hessian.security包下面有两个类X509Encryption和X509Signature,一个是用来加密解密的,一个是用来签名认真的。
很遗憾hessian虽然提供了这两项功能但是它并没有使用上去,甚至还没有给我们开了口子来使用它。
仍然不甘心,于google,baidu,bing多方搜索hessian的内置加密方式如何使用,仍然没有结果。
没有办法只能自己来提供对传输的数据进行加密和解密的方式了。
在这里提供了两套加密解密方式:非对称密钥的RSA和对称密钥的AES。
一、非对称密钥加密算法RSA非对称密钥算法需要一对密钥:公开密钥和私有密钥。
利用公开密钥进行加密后的信息,只有用对应的私有密钥才能解密。
因为加密和解密用的密钥是不一样的,因此,公开密钥是公开的,供所有人使用,并且不会威胁到传递信息和解密密钥的安全,不需要对密钥传递的额外保护。
首先,提供RSA的密钥生成算法,生成公有密钥和私有密钥存入文件中:且看RSAKeyCreater.javaRSAKeyCreater类中createKeyFile()方法生成公钥和私钥分别保存到public_key_file.rsa和private_key_file.rsa文件中,加密和解密时进行使用。
其次,提供加密解密算法,对byte[] 进行加密和解密:且看RSAEncryptionUtil.javaRSAEncryptionUtil的encryptWithPublicKey()方法对信息进行加密,decryptWithPrivateKey()方法对加密后的信息进行解密,分别需要传入公有和私有密钥。
由于提供的算法是对byte[]数组进行加密和解密返回新的byte[],因此我们需要提供一个普通object对象到byte[]之间转化的工具:且看SerializationUtil.javaSerializationUtil类中的serialize()方法将普通java对象序列化成byte[],deserialize()方法将byte[]反序列化成原来的对象。
hessian接口使用总结

Hessian接口使用示例总结一、使用hessian接口准备首先,hessian接口的使用,必须要准备hessian接口的jar包,本文使用的jar包如下:hessian-4.0.7.jarHessian接口的使用是在两个工程之间,工程A作为服务方,B作为使用方(客户端)c二、服务方的配置和服务类的编写A作为服务方,首先向A中导入hessian的jar包,若是maven工程,则直接添加hessian的依赖jar则可,否则直接将jar导入工程lib下面。
依赖添加如下:在A的pom.xml中添加<dependency><groupTd>com.caucho</groupld> <artifa匚tId >hessian actld> </dependency>添加完依赖之后,实现hessian的服务配置实现。
配置hessian的servlet,便于服务方可以解析hessian的服务请求。
在A中web.xml配置hessian的servlet如下:配置完servlet之后,客户端的.hs的方式请求,都会按照servlet的配置,会到hessian-servlet.xml文件中读取配置,找到对应的服务的类方法。
下面配置hessian-servlet.xml 文件。
本文件为spring的配置文件,主要存放hessian的服务方的配置多个hessian接口的配置均可以放到本文件中统一管理。
下面以/hessia nTestService.hs为例解释:配置如下<bean n class= ■匸网川曲宣昭・test ・片它百£存占刃7倉5亡4厂1/1巴兰''>町/12皂£1[17匕杠-』 n am &= *7側趕舊 sJ^rt F M r5ern/ire . h£ J |class = ^org. springfraf^^forkr renting. W?s5J ^nSjer^i cFfir/wr^r ,-><prop&rty name= ir s&rvic^ " ref= i " /><:property nam 轻二 n ^^rvl^inr^rf3c^tr mlu0= Vtw.占呦官.r^jr. I/^saw rfisrs^r^i " /><7bean>Bean name= “hessianTestService 此为"hessian 接口的服务类的 bean 配置,这个大家都懂的, Bean name = /hessianTestService.hs "服务名,以.hs 结尾,同时对应 hessian 的 servlet 的分发 配置 url mapping 女口上面的 servlert 的配置。
hessian服务原理

Hessian是一种轻量级的远程方法调用(RPC)协议,它基于HTTP协议进行传输。
Hessian服务原理主要包括以下几个方面:
1. 方法调用:Hessian允许客户端远程调用服务端的方法,就像调用本地方法一样。
客户端通过发送HTTP请求到服务端,请求中包含方法名和参数。
服务端接收到请求后,执行相应的方法,并将结果返回给客户端。
2. 数据序列化和反序列化:Hessian使用一种二进制序列化格式来编码和解码数据。
这种格式可以有效地处理各种数据类型,包括基本类型、对象和数组。
序列化和反序列化过程由Hessian库自动处理,无需开发者进行额外的编码。
3. 服务端实现:服务端需要实现Hessian服务,将远程调用的方法映射到实际的业务逻辑方法上。
这通常通过实现一个Hessian服务接口或者使用注解来完成。
服务端还需要部署一个Hessian服务容器,如Spring或Dubbo,来托管和管理Hessian服务。
4. 客户端调用:客户端需要使用Hessian客户端库来发起远程方法调用。
客户端库会将方法名和参数打包成HTTP
请求,发送到服务端。
服务端返回的结果会被客户端库解包并转换为本地对象。
5. 性能优化:Hessian协议使用二进制序列化格式,相对于基于文本的协议(如XML或JSON),可以提高数据传输的效率和性能。
此外,Hessian还支持压缩和缓存等优化技术,以减少网络传输的开销。
总之,Hessian服务原理是通过HTTP协议传输二进制序列化数据,实现轻量级的远程方法调用。
这使得分布式系统中的组件可以透明地进行交互,简化了系统的设计和开发。
hessian协议中文版

Hessian 2.0序列化协议规范翻译: Edison peng目录1.概述 (4)2.设计目标 (4)3. Hessian语法 (4)4. 序列化 (6)4.1. 二进制数据 (7)4.1.1. 压缩格式:短二进制 (7)4.1.2. Binary实例 (7)4.2. boolean (7)4.3.date (8)4.3.1. Date实例 (8)4.4. double (8)4.4.1. 压缩格式:double表示的0 (8)4.4.2. 压缩格式:double 表示的1 (8)4.4.3. 压缩格式:单字节double (9)4.4.4. 压缩格式:short型double (9)4.4.5. float型double (9)4.4.6. Double实例 (9)4.5. int (9)4.5.1. 单字节整型 (10)4.5.2. 双字节整型 (10)4.5.3. 三字节整型 (10)4.5.4. 整型实例 (10)4.6. list (11)4.6.1. 压缩格式: repeated list (11)4.6.2. List实例 (11)4.7. long (12)4.7.1. 压缩格式: 单字节long (12)4.7.2. 压缩格式: 双字节long (12)4.7.3. 压缩格式: 3字节long (12)4.7.4. 压缩格式: 四字节long (13)4.7.5. long实例 (13)4.8.map (13)4.8.1. Map实例 (13)4.9. null (14)4.10. 对象(object) (15)4.10.1. 压缩格式: class定义 (15)4.10.2. 压缩格式: 对象实例 (15)4.10.3. 对象实例 (15)4.11. 引用(ref) (16)4.11.1. 压缩格式: 双字节引用 (17)4.11.2. 压缩格式: 三字节引用 (17)4.11.3. 引用实例 (17)4.12. string (18)4.12.1. 压缩格式: 短字符串 (18)4.12.2 字符串实例 (18)4.13. 类型(type) (18)4.14. 压缩格式: 类型引用 (18)5. 引用表(Reference Map) (19)5.1. 值引用 (19)5.2. class引用 (19)5.3. type引用 (19)6. 字节码映射表(Bytecode map) (19)1.概述Hessian是一个轻量级的,自定义描述的二进制RPC协议。
Hessian协议解析

Hessian协议解析协议名称:Hessian协议解析一、背景介绍Hessian协议是一种基于二进制的轻量级远程调用协议,用于在分布式系统中进行跨语言的通信。
它使用简单的二进制格式来序列化和反序列化数据,并支持多种编程语言,如Java、C#、Python等。
本协议旨在详细解析Hessian协议的结构、数据类型和通信流程,以便更好地理解和使用该协议。
二、协议结构Hessian协议采用二进制格式进行数据传输,其结构可以分为请求部分和响应部分。
1. 请求部分请求部分由请求头和请求体组成。
1.1 请求头请求头包含以下字段:- 协议版本:指示所使用的Hessian协议的版本号。
- 请求类型:指示请求的类型,如调用远程方法、获取远程对象等。
- 请求方法:指示具体的远程方法名或对象名。
- 请求ID:用于标识请求的唯一ID,用于匹配请求和响应。
1.2 请求体请求体是实际的数据载荷,可以是方法参数、对象序列化数据等。
2. 响应部分响应部分由响应头和响应体组成。
2.1 响应头响应头包含以下字段:- 协议版本:指示所使用的Hessian协议的版本号。
- 响应类型:指示响应的类型,如成功、失败等。
- 请求ID:与请求部分的请求ID对应,用于匹配请求和响应。
2.2 响应体响应体是实际的数据载荷,可以是方法返回值、对象反序列化数据等。
三、数据类型Hessian协议支持多种数据类型的序列化和反序列化,包括基本数据类型、数组、字符串、日期、集合等。
1. 基本数据类型Hessian协议支持的基本数据类型包括整型、浮点型、布尔型、字符型等。
2. 数组Hessian协议支持一维和多维数组的序列化和反序列化,可以是基本数据类型的数组或对象数组。
3. 字符串Hessian协议支持字符串的序列化和反序列化,使用UTF-8编码。
4. 日期Hessian协议支持日期类型的序列化和反序列化,使用标准的ISO 8601日期格式。
5. 集合Hessian协议支持集合类型的序列化和反序列化,包括列表、集合、映射等。
hessian序列化null参数

hessian序列化null参数摘要:1.Hessian 简介2.Hessian 序列化null 参数的问题3.解决方案及原因分析4.总结正文:Hessian 是一个轻量级的二进制RPC 协议,其将方法调用的参数和返回值序列化为二进制数据,实现语言无关的调用。
在实际使用过程中,可能会遇到Hessian 序列化null 参数的问题。
当序列化null 参数时,Hessian 会抛出NullPointerException。
为了解决这个问题,可以采用以下方法:方案一:使用序列化过滤器。
通过实现Hessian 的Filter 接口,自定义一个序列化过滤器,对序列化null 参数进行处理。
在filter 方法中,可以返回一个默认值或者直接跳过null 参数的序列化。
例如:```javapublic class NullFilter implements Filter {@Overridepublic Object filter(Object value) {if (value == null) {return defaultValue;}return value;}}```方案二:修改Hessian 源码。
通过修改Hessian 源码,实现对null 参数的自动处理。
在Hessian 的序列化过程中,可以判断参数是否为null,如果为null 则不进行序列化。
例如:```javapublic static void writeObject(Output output, Object obj) throws IOException {if (obj == null) {output.writeNull();} else {// 其他序列化逻辑}}```原因分析:Hessian 在序列化过程中,会调用对象的toString 方法。
当参数为null 时,调用null 的toString 方法会抛出NullPointerException。
Hessian协议解析 (2)

Hessian协议解析一、协议目的本协议旨在规范Hessian协议的解析过程,确保数据的准确传输和解析。
二、协议范围本协议适用于所有涉及Hessian协议解析的场景,包括但不限于网络通信、数据传输等。
三、术语定义1. Hessian协议:一种基于二进制的轻量级网络协议,用于在不同平台之间进行数据传输和解析。
2. 序列化:将数据对象转换为二进制格式以便传输。
3. 反序列化:将二进制数据转换为数据对象以便解析和使用。
四、解析流程1. 接收数据1.1 从网络通信中接收到Hessian数据。
1.2 将接收到的数据存储为字节数组。
2. 解析数据2.1 创建Hessian解析器对象。
2.2 调用解析器的反序列化方法,将字节数组转换为数据对象。
2.3 根据数据对象的类型进行相应的处理。
2.3.1 如果是基本数据类型,直接使用。
2.3.2 如果是复杂数据类型,根据具体需求进行解析和处理。
3. 错误处理3.1 检查解析过程中是否出现错误。
3.2 如果有错误,根据错误类型进行相应的处理,如记录日志、返回错误信息等。
五、数据格式1. 基本数据类型1.1 字符串:使用UTF-8编码。
1.2 整数:使用4字节或8字节表示。
1.3 浮点数:使用4字节或8字节表示。
1.4 布尔值:使用1字节表示,0表示false,1表示true。
1.5 空值:使用特定的标记表示。
2. 复杂数据类型2.1 数组:使用特定的标记表示开始和结束,每个元素之间使用逗号分隔。
2.2 对象:使用特定的标记表示开始和结束,每个属性使用键值对表示,键和值之间使用冒号分隔,属性之间使用逗号分隔。
六、安全性考虑1. 数据校验:在解析过程中,对接收到的数据进行校验,确保数据的完整性和正确性。
2. 防止注入攻击:对接收到的数据进行严格的解析和验证,防止恶意数据的注入。
3. 权限控制:对解析过程进行权限控制,确保只有授权的用户可以进行解析操作。
七、性能优化1. 数据压缩:在传输过程中,对数据进行压缩,减少传输的数据量。
HISE协议

Hessian协议
Hessian二进制的网络协议使不需要引入大型框架下就可以使用,并且不需要学习其它的入门的协议。
因为它是二进制协议,它更擅长于发送二进制数据,而不需要引入其它附件去扩展它的协议。
Hessian是一个动态类型,二进制序列化,也是网络协议为了对象的定向传输。
Hessian协议有以下的设计目标:
1.它必须自我描述序列化的类型,即不需要外部架构和接口定义。
2.它必须是语言语言独立的,要支持包括脚本语言。
3.它必须是可读可写的在单一的途径。
4.它要尽可能的简洁。
5.它必须是简单的,它可以有效地测试和实施。
6.尽可能的快。
7.必须要支持Unicode编码。
8.它必须支持八位二进制文件,而不是逃避或者用附件。
9.它必须支持加密,压缩,签名,还有事务的上下文。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、在Hessian官网上下载Hessian的jar包,我下载了for java的;(如hessian-4.0.3.jar,
hessian-4.0.3-src.jar);
2、把Hessian协议导入到Eclipse工程中,(例如工程Test);
目录结构:
把下载的Hessian的jar包放在WEB-INF\lib文件夹下,选中Test工程,右键单击,选Refresh(or直接F5刷新)后,在project|propertise|Java Build Path|Librarise,单击ADD Jar添加jar包;
3、纯Java环境下例子:
(1)客户端接口
//客户端接口
package dhdemo;
public interface myHello {
String sayHello();//远程调用接口
}
////////////////////////////////////////
(2)
客户端接口实现类
//服务器端接口实现类IMyHello
package dhdemo;
import dhdemo.myHello;
import com.caucho.hessian.server.HessianServlet;
public class IMyHello extends HessianServlet implements myHello {
public String sayHello()
{
return "============Hello world!==========";
}
}
(3)配置tomcat下的root\web-inf下的web.xml
<!-- hessian协议的servlet配置-->
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> <init-param>
<param-name>home-class</param-name>
<param-value>dhdemo.IMyHello</param-value>
</init-param>
<init-param>
<param-name>home-api</param-name>
<param-value>dhdemo.myHello</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>
(4)利用HessianProxyFactory从客户端输出向服务器端的请求
package dhdemo;
import com.caucho.hessian.client.HessianProxyFactory;
public class OutputHello
{
public static void main (String[] args) {
String url="http://localhost:8080/Hello";
HessianProxyFactory factory=new HessianProxyFactory();
try{
myHello hello=(myHello)factory.create(myHello.class,url);
System.out.println(hello.sayHello());
}catch(Exception e)
{System.out.print("无法访问远程服务"+e);}
}
}
///////////////////////////////////////
Jsp技术下实现浏览器输出
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>
<%@ page import="com.caucho.hessian.client.HessianProxyFactory"%>
<%@ page import="dhdemo.myHello"%>
<%
String url="http://localhost:8080/Hello";
HessianProxyFactory factory=new HessianProxyFactory();
try{
myHello hello=(myHello)factory.create(myHello.class,url);
out.println(hello.sayHello());
}catch(Exception e)
{out.print("无法访问远程服务"+e);}
%>
<body>
</body>
</html>
注:有时在“public class IMyHello extends HessianServlet implements myHello”这里会遇到错误,错误提示“the type javax servlet GeneralServlet not resolved,it indirect……”,这是因为没有把javax.servlet.jar包放在Test工程的WEB-INF\lib下,在MyEclipse\eclipse\plugins下找到javax.servlet.jar文件,放在lib文件夹下,按照导入Hessian的jar包一样的方法,导入到Test工程中就可以了。