Spring之集成之使用Hession或Burlap通过http远程调用业务

来源:互联网 发布:北京程序员周末培训班 编辑:程序博客网 时间:2024/06/08 19:46

Hession提供二进制基于HTTP远程协议。

为Hession连接DispatcherServlet

Hession借助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’目录下创建一个Spring容器的配置资源,命名为'remoting-servlet.xml' (你的Servlet名字)。这个应用程序上下文将在下一章节用到。


作为可选地,考虑Spring更简单的HttpRequestHandlerServlet的用法。允许在你的根应用上下文中嵌入远程输出者定义(默认在'WEB-INF/applicationContext.xml'),各个Servlet 定义指向指定的输出bean。每个Servlet名字需要匹配目标输出者的bean名。


21.3.2 通过使用HessianServiceExporter暴露你的bean

在新建的应用上下文“remoting-servlet.xml”,我们创建HessianServiceExporter来暴露你的业务。


<bean id="accountService" class="example.AccountServiceImpl">    <!-- any additional properties, maybe a DAO? --></bean><bean name="/AccountService" class="org.springframework.remoting.caucho.HessianServiceExporter">    <property name="service" ref="accountService"/>    <property name="serviceInterface" value="example.AccountService"/></bean>

现在我们准备连接客户端的业务。没有指定直接的处理器映射,映射请求到对应的业务上,这样将使用BeanNameUrlHandlerMapping。因此,这个业务将通过其bean名由URL(包含了DispatcherServlet的映射)指定来暴露(如上定义):'http://HOST:8080/remoting/AccountService'


作为可选地,在你的根应用程序上下文中创建一个HessianServiceExporter:(例如:'WEB-INF/applicationContext.xml'

<bean name="accountExporter" class="org.springframework.remoting.caucho.HessianServiceExporter">    <property name="service" ref="accountService"/>    <property name="serviceInterface" value="example.AccountService"/></bean>


在后面的例子中,为这个调用者在web.xml中定义一个对应的Servlet,这样有相同的结局结果:调用者映射到请求路劲:/remoting/AccountService。注意到Servlet的名字需要映射到目标调用者的bean名称。


<servlet>    <servlet-name>accountExporter</servlet-name>    <servlet-class>org.springframework.web.context.support.HttpRequestHandlerServlet</servlet-class></servlet><servlet-mapping>    <servlet-name>accountExporter</servlet-name>    <url-pattern>/remoting/AccountService</url-pattern></servlet-mapping>

21.3.3 在客户端联系业务


使用HessianProxyFactoryBean我们可以在客户端联系业务。同样的原理适用于RMI例子。我们将创建一个独立的bean工厂或者应用程序上下文,并提醒下面的beans,SimpleObject正在使用AccountService管理账户。


<bean class="example.SimpleObject">    <property name="accountService" ref="accountService"/></bean><bean id="accountService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">    <property name="serviceUrl" value="http://remotehost:8080/remoting/AccountService"/>    <property name="serviceInterface" value="example.AccountService"/></bean>

21.3.4 使用Burlap

这里不讨论Burlap,与Hessian基于XML的相同。细节方面,由于其也是可配置的和与Hessian同样的方式,这里只需要将Hassian用Burlap替换就可以了。


21.3.5 应用HTTP基本校验通过Hessian或者Burlap暴露业务


Hessian和Burlap的优点之一是可以轻易应用HTTP的基本校验,因为两者的协议都是基于HTTP的。一般的HTTP服务安全机制可以很容易地应用使用web.xml的安全功能。通常,你不使用每个用户的安全认证,而是在Hessian/BurlapProxyFactoryBean层次共享认证定义(与JDBC DataSource相似)。


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

这是个直接提到BeanNameUrlHandlerMapping并且设置一个调用者仅允许管理员和调用者来调用应用程序上下文中的beans。


注意:当然了,这个例子没有显示一中灵活的安全机制。更多详情可以参考Spring提供的spring-security





0 0
原创粉丝点击