加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Hessian的使用简介

发布时间:2020-12-16 23:44:58 所属栏目:安全 来源:网络整理
导读:? ?Hessian:hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能,相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用了二进制协议,所以它很适合于发送二进制数据,Hessian主要作面向对象的消息通信。Hessian的

??Hessian:hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能,相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用了二进制协议,所以它很适合于发送二进制数据,Hessian主要作面向对象的消息通信。Hessian的初衷就是支持动态类型,格式紧凑,跨语言Hessian是使用自己的序列化机制实现的编组和反编组,其支持的数据类型是有限制的,不支持复杂的对象,可以穿透防火墙,在这里不得不说一下RMI:RMI是一组用户开发分布式应用程序的API。他使用的是java序列化机制实现调用及返回值的编组于反编组。它使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。他可以被看做是RPC的Java版本,因为传统的RPC并不能很好的应用于分布式对象系统。而Java RMI则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。他也有它的缺点,他只能通过RMI协议来进行访问无法通过HTTP协议访问,无法穿透防火墙。
?还有一种远程调用方法就是HttpInvoker:他也是将参数和返回值通过Java的序列化机制进行编组和反编组,它具有RMI的支持所有可序列化对象的优点。试使用Http协议传输二进制流的,同时又具有Hessian、Burlap(传输xml文本)的优点。

二、写一个简单的hessian通信所需要知道写哪些内容?
Hessian:写一个Hessian需要注意的问题:
?1、JAVA服务器端必须具备以下几点:
?包含Hessian的jar包
?设计一个接口,用来给客户端调用
?实现该接口的动能
?配置web.xml,配置相应的servlet
?对象必须实现Serializable接口
?对于复杂对象可以使用Map的方法传递
?2、客户端必须具备以下几点:
?java客户端包含Hessian.jar包
?具有和服务器端结构一样的接口和实体类。包括命名空间都最好一样。利用HessianProxyFactory调用远程接口
三、简单hessian实例:
1、在服务端的接口:
public interface IHello {

?String sayHello();
}
2、在服务端的实现类:
public class IHelloImpl extends HessianServlet implements IHello {
?@Override
?public String sayHello() {
???// TODO Auto-generated method stub
?return "Hello,I from HessianService";
?}
3、在客户端的类:
public class ClientTest {
?public static String url = "http://127.0.0.1:8080/HessianService/Hello";
?public static void??main(String[] args){
?HessianProxyFactory factory = new HessianProxyFactory();
?try {
?IHello iHello = (IHello) factory.create(IHello.class,url);
?System.out.println(iHello.sayHello());
?} catch (MalformedURLException e) {
?// TODO Auto-generated catch block
?e.printStackTrace();
3、先将服务器端的类link到客户端,或者是将服务器端打包放到客户端,
4、在web.xml中进行配置:
服务器端: <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>com.kcpt.hessian.service.IHelloImpl</param-value>
?</init-param>
?<param-name>home-api</param-name>
?<param-value>com.kcpt.hessian.service.IHello</param-value>
?<load-on-startup>1</load-on-startup>
?</servlet>
?<servlet-mapping>
?<url-pattern>/Hello</url-pattern>
?</servlet-mapping>
执行成功:输出Hello,I from HessianService,这是简单的hessian实现方式,看起来比较简单

Hessian与Spring集成

说明?:

1.????讲述如何配置Hessian的服务器端(与Spring集成).

2.????讲述客户端如何调用

①???使用HessianProxyFactory??Hessian代理工厂直接调用

②???使用HessianProxyFactoryBean Hessian代理工厂Bean来完成接口调用.

?

接口定义类: com.wtang.isay. Isay:

?

[java]? view plain copy
  1. package?com.wtang.isay;??
  2. ??
  3. public?interface?Isay?{??
  4. ????public?String?sayHello(String?arg1,String?arg2);??
  5. }??

接口具体实现类: com.wtang.isay. IsayImpl

[java]? class?IsayImpl?implements?Isay?{??
  • ??
  • ????????????return?"Hello:"?+?arg1?+?arg2;??
  • ????}??
  • }??
  • 配置Web.xml:

    [java]?
  • <servlet>??
  • ????<servlet-name>remote</servlet-name>??
  • ????<!--?使用Spring的代理Servlet?-->??
  • ????<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>??
  • ????<init-param>??
  • ????????<param-name>namespace</param-name>??
  • ????????<param-value>classes/remote-servlet</param-value>??
  • ????</init-param>??
  • ????<load-on-startup>1</load-on-startup>??
  • </servlet>??
  • ??
  • <servlet-mapping>??
  • ????<servlet-name>remote</servlet-name>??
  • ????<url-pattern>/remote/*</url-pattern>??
  • </servlet-mapping>??
  • 配置remote-servlet.xml[该文件位于src目录下,即编译后存在与classes下]:

    [java]?
  • <!DOCTYPE?beans?PUBLIC?"-//SPRING//DTD?BEAN//EN"?"http://www.springframework.org/dtd/spring-beans.dtd">??
  • <beans>??
  • ????<!--?接口的具体实现类?-->??
  • ????<bean?id="impl"?class="com.wtang.isay.IsayImpl"?/>??
  • ????<!--?使用Spring的HessianServie做代理?-->??
  • ????<bean?name="/helloSpring"??
  • ????class="org.springframework.remoting.caucho.HessianServiceExporter">??
  • ????????<!--?service引用具体的实现实体Bean-->??
  • ????????<property?name="service"?ref="impl"?/>??
  • ????????<property?name="serviceInterface"?value="com.wtang.isay.Isay"?/>??
  • ????</bean>??
  • ??????
  • ????<!--?可以配置多个HessianServiceExporter代理Bean?-->??
  • </beans>??
  • 注:

    ????? 这个文件为什么叫remote-servlet.xml呢?

    因为我们在web.xml中有配置:<servlet-name>remote</servlet-name>。

    所以remote-servlet.xml的文件名必须以

    <servlet-name>中配置的servlet-name作为文件名的开头,

    且文件名的格式必须是[servlet-name]-servlet.xml格式,否则检测不到。

    ????即:

    <param-value>classes/remote-servlet</param-value>

    所以文件名为remote-servlet.xml。

    ????????①?使用HessianProxyFactory? Hessian代理工厂直接调用

    ?即:

    ???????

    [java]? package?com.wtang.test;??
  • ??
  • import?java.net.MalformedURLException;??
  • import?com.caucho.hessian.client.HessianProxyFactory;??
  • import?com.wtang.isay.Isay;??
  • ??
  • class?NormalClient?{??
  • ????static?void?main(String[]?args)?throws?MalformedURLException?{??
  • ????????//Spring?Hessian代理Servelet??
  • ????????String?url?=?"http://localhost:8080/HessianSpring/remote/helloSpring";??
  • ????????HessianProxyFactory?factory?=?new?HessianProxyFactory();??
  • ????????Isay?api?=?(Isay)?factory.create(Isay.class,?url);??
  • ??
  • ????????System.out.println(api.sayHello("chen",?"weitang"));??
  • ????}??
  • }??
  • 输出Hello:chenweitang

    ????????②?使用HessianProxyFactoryBean Hessian代理工厂Bean来完成接口调用.

    配置客户端 remote-client.xml:

    [java]?
  • <!DOCTYPE?beans?PUBLIC?"-//SPRING//DTD?BEAN//EN"?"http://www.springframework.org/dtd/spring-beans.dtd">??
  • <beans>??
  • ????<!--?客户端Hessian代理工厂Bean?-->??
  • ????<bean?id="clientSpring"?class="org.springframework.remoting.caucho.HessianProxyFactoryBean">??
  • ????????<!--?请求代理Servlet路径?-->??????????
  • ????????<property?name="serviceUrl">??
  • <value>http://localhost:8080/HessianSpring/remote/helloSpring</value>??
  • ????????</property>??
  • ????????<!--?接口定义?-->??
  • ????????<property?name="serviceInterface">??
  • ????????????<value>com.wtang.isay.Isay</value>??
  • ????????</property>??
  • ????</bean>??
  • </beans>??
  • 调用:

    [java]? import?org.springframework.context.ApplicationContext;??
  • import?org.springframework.context.support.ClassPathXmlApplicationContext;??
  • class?SpringClient?{??
  • ????void?main(String[]?args)?{??
  • ????????ApplicationContext?contex?=?new?ClassPathXmlApplicationContext(??
  • ????????????????"remote-client.xml");??
  • ??
  • ????????//?获得客户端的Hessian代理工厂bean??
  • ????????Isay?i?=?(Isay)?contex.getBean("clientSpring");??
  • ????????System.out.println(i.sayHello("chen",51)">输出Hello:chenweitang

  • (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读