18.3.使用Hessian或者Burlap通过HTTP远程调用服务

优质
小牛编辑
126浏览
2023-12-01

18.3. 使用Hessian或者Burlap通过HTTP远程调用服务

Hessian提供一种基于HTTP的二进制远程协议。它是由Caucho创建的,可以在 http://www.caucho.com 找到更多有关Hessian的信息。

18.3.1. 为Hessian配置DispatcherServlet

Hessian使用一个特定的Servlet通过HTTP进行通讯。使用Spring的DispatcherServlet,可以很容易的配置这样一个Servlet来暴露你的服务。首先我们要在你的应用里创建一个新的Servlet(下面来自web.xml文件):

<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>remoting</servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>

你可能对Spring的DispatcherServlet很熟悉,这样你就知道,需要在 WEB-INF 目录里创建一个名为 remoting-servlet.xml(在你的servlet名后)的应用上下文。这个应用上下文将在下一节中里使用。

18.3.2. 使用HessianServiceExporter暴露你的bean

在新创建的 remoting-servlet.xml 应用上下文里,我们将创建一个HessianServiceExporter来暴露你的服务:

<bean id="accountService">
  <!-- any additional properties, maybe a DAO? -->
</bean>

<bean name="/AccountService">
  <property name="service" ref="accountService"/>
  <property name="serviceInterface" value="example.AccountService"/>
</bean>

现在,我们准备在客户端连接服务了。不必显示指定处理器的映射,只要使用BeanNameUrlHandlerMapping把URL请求映射到服务上:所以,这个服务将在由bean名称指明的URL http://HOST:8080/remoting/AccountService 位置进行暴露。

18.3.3. 客户端连接服务

使用 HessianProxyFactoryBean,我们可以在客户端连接服务。同样的方式对RMI示例也适用。我们将创建一个单独的bean工厂或者应用上下文,而后简单地指明下面的bean SimpleObject将使用AccountService来管理accounts:

<bean>
  <property name="accountService" ref="accountService"/>
</bean>

<bean id="accountService">
<property name="serviceUrl" value="http://remotehost:8080/AccountService"/>
<property name="serviceInterface" value="example.AccountService"/>
</bean>

这就是所有要做的。

18.3.4. 使用Burlap

我们在这里将不去仔细讨论Burlap,它是一个基于XML的Hessian替代方案。它的配置方法和上述Hessian的一样。只要把 Hessian 换成 Burlap 就行了。

18.3.5. 对通过Hessian或Burlap暴露的服务使用HTTP基础认证

Hessian和Burlap的一个优势是我们可以容易的使用HTTP基础认证,因为他们二者都是基于HTTP的。例如,普通HTTP Server安全机制可以通过使用 web.xml 安全特征来应用。通常,你不会为每个用户都建立不同的安全证书,而是在Hessian/BurlapProxyFactoryBean级别共享安全证书(类似一个JDBC数据源)。

<bean>
<property name="interceptors">
<list>
<ref bean="authorizationInterceptor"/>
</list>
</property>
</bean>

<bean id="authorizationInterceptor"
class="org.springframework.web.servlet.handler.UserRoleAuthorizationInterceptor">
<property name="authorizedRoles">
<list>
<value>administrator</value>
<value>operator</value>
</list>
</property>
</bean>

这个例子里我们显式使用了BeanNameUrlHandlerMapping,并设置了一个拦截器,后者将只允许管理员和操作员调用这个应用上下文中提及的bean。

注意:当然,这个例子没有演示灵活的安全设施。考虑更多有关安全的问题时,请参阅 http://acegisecurity.sourceforge.net 处的Acegi Security System for Spring