Spring+Hessian搭建远程方法调用
1、hessian调用分为服务端和客户端
2、总体图
3、服务端配置
(1)web.xml
<!-- hessian 配置 默认会加载hessian-servlet.xml-->
<servlet>
<servlet-name>hessian</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>hessian</servlet-name>
<url-pattern>/hessian/*</url-pattern>
</servlet-mapping>
<!-- hessian 配置 -->
(2)Interface
public interface WebHessianService {
void test();
}
(3)Implement
@Service("webHessianService")
public class WebHessianServiceImpl implements WebHessianService {
public void test(){
system.out.println();
}
}
(4)HessianServerProxyExporter:
Servlet-API-based HTTP request handler that exports the specified service bean as Hessian service endpoint, accessible via a Hessian proxy.
public class HessianServerProxyExporter extends HessianServiceExporter {
private static Logger logger = LoggerFactory.getLogger(HessianServerProxyExporter.class);
PropertyUtil propertyUtil = PropertyUtil.getInstance("project");
public String hessianAuth;
public HessianServerProxyExporter() {
this.hessianAuth = this.propertyUtil.getProperty("hessianAuth");
}
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
logger.info("++++ hessian request clientIp:" + request.getRemoteAddr() + "++++requestData:" + request.getRequestURL());
String auth = request.getHeader("hessianAuth");
if(auth != null && auth.equalsIgnoreCase(this.hessianAuth)) {
super.handleRequest(request, response);
} else {
logger.info("+++++hessianAuth->fail :" + request.getRemoteAddr() + "," + request.getRequestURL());
}
}
}
(5)ServiceBean
<!-- Hessian访问路径 含权限认证 -->
<bean name="/webHessian" class="com.qysxy.hessian.server.HessianServerProxyExporter">
<property name="service" ref="webHessianService"/>
<property name="serviceInterface">
<value>
com.qysxy.framework.hessian.WebHessianService
</value>
</property>
</bean>
4、客户端配置
(1)HessianClientProxyFactory :hessian客户端代理
public class HessianClientProxyFactory extends HessianProxyFactory {
PropertyUtil propertyUtil = PropertyUtil.getInstance("project");
private final String hessianAuth;
public HessianClientProxyFactory() {
this.hessianAuth = this.propertyUtil.getProperty("hessianAuth");
}
protected URLConnection openConnection(URL url) throws IOException {
URLConnection conn = super.openConnection(url);
conn.setRequestProperty("hessianAuth", this.hessianAuth);
return conn;
}
}
(2)Interface
public interface WebHessianService {
void test();
}
(3)clientBean:
<bean id="webHessianService"
class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<property name="serviceInterface"
value="com.qysxy.framework.hessian.service.WebHessianService"></property>
<property name="serviceUrl">
<value>${hessianPath}/hessian/webHessian</value>
</property>
<property name="readTimeout">
<value>100000</value>
</property>
<property name="proxyFactory">
<bean
class="com.*.hessian.client.HessianClientProxyFactory" />
</property>
<property name="chunkedPost" value="false" />
</bean>
5、测试
@Test
public void hessian() {
String url = "http://127.0.0.1/hessian/webHessian";
HessianClientProxyFactory factory = new HessianClientProxyFactory();
try {
WebHessianService service = (WebHessianService) factory.create(WebHessianService.class, url);
service.test();
System.err.println("map=" + map.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
6、总结:
服务端是需要定义方法接口并且实现方法,利用servlet和spring的拦截器控制访问;
客户端可以用bean组件定义好调用方法接口、访问URL、hessian代理工厂