spring集成Hessian的基本使用方法
一、什么是RPC
RPC全称Remote Procedure Call,中文名叫远程过程调用。RPC是一种远程调用技术,用于不同系统之间的远程相互调用。其在分布式系统中应用十分广泛。
二、什么是Hessian
Hessian是一个轻量级的RPC框架。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
三、Hessian的使用
1、引入jar包
<dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
<version>4.0.38</version>
</dependency>
2.编写业务代码(和普通的业务代码一样)
public interface UserService {
String getUserInfoById (Integer id);
}
@Component("uservice")
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
public String getUserInfoById(Integer id) {
User user = userMapper.selectByPrimaryKey(id);
return user.toString();
}
}
3.创建并加载hessian-servlet.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 使用Spring的HessianServie做代理 -->
<bean name="/userServiceImpl" class="org.springframework.remoting.caucho.HessianServiceExporter">
<!-- service引用具体的实现实体Bean-->
<property name="service" ref="uservice" />
<property name="serviceInterface" value="com.myproject.hessian.UserService" />
</bean> </beans>
public class HessianServiceProxyExporter extends HessianServiceExporter {
private static final Base64 base64 = new Base64();
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String authorization = request.getHeader("Authorization");
if(authorization != null && authorization.length() > 0){
String userAndPwd = new String(base64.decode(authorization.split(" ")[1]));
String user = userAndPwd.split(":")[0];
String password = userAndPwd.split(":")[1];
if("user".equalsIgnoreCase(user) && "123456".equalsIgnoreCase(password)) {
super.handleRequest(request, response);
} else {
System.out.println("您无权调用");
}
}
}
}
<beans>
<!-- 自己定义代理类来继承org.springframework.remoting.caucho.HessianServiceExporter类,然后进行权限等一系列操作-->
<bean name="/userServiceImpl" class="com.myproject.hessian.exporter.HessianServiceProxyExporter">
<!-- service引用具体的实现实体Bean-->
<property name="service" ref="uservice" />
<property name="serviceInterface" value="com.myproject.hessian.UserService" />
</bean> </beans>
<!-- web.xml中进行拦截,并加载配置文件hessian -->
<servlet>
<servlet-name>hessian</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:hessian-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>hessian</servlet-name>
<url-pattern>/hessian/*</url-pattern>
</servlet-mapping>
5.客户端编写
①普通方式调用。同样需要引入hessian的jar包
//先将服务端的服务接口搬过来,包名和类名方法名最好是要一模一样
public interface UserService { String getUserInfoById (Integer id);
} public class Test { public static void main(String[] args) throws MalformedURLException {
String url = "http://localhost:8080/zmyproject/hessian/userServiceImpl";
HessianProxyFactory factory = new HessianProxyFactory();
factory.setUser("user");
factory.setPassword("123456");
UserService userService = (UserService)factory.create(UserService.class, url);
System.out.println(userService.getUserInfoById(2));
}
}
②spring框架调用
Ⅰ、先引入jar包,注意jar包的版本我使用的hession-3.1.5.jar,启动会找不到一个factory类,所以用了4.0.38版本的。
Ⅱ、配置hession-client.xml,并加载该文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.1.xsd"> <!--客户端Hessian代理工厂Bean-->
<bean id="userService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<!--这是因为接口中出现方法重载,在调用时,服务器端会跑出异常 。在整合spring中,在客户端的配置里面加上如下代码可以解决:-->
<property name="overloadEnabled" value="true" />
<!--请求代理Servlet路径:-->
<property name="serviceUrl" value="http://localhost:8080/zmyproject/hessian/userServiceImpl" />
<!--接口定义:-->
<property name="serviceInterface" value="com.myproject.hessian.UserService" />
<property name="username" value="user" />
<property name="password" value="123456" />
</bean> </beans>
<!-- web.xml中配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:hession-servlet.xml</param-value>
</context-param>
//和hessian服务端一样的接口
public interface UserService { String getUserInfoById (Integer id);
} @Controller//将该类标注为处理器,并且加入spring容器中
@RequestMapping("/hessian")
public class HessianController{ @Autowired
private UserService userService; @RequestMapping(value="/getInfo",method=RequestMethod.GET)
@ResponseBody
public String getInfo(HttpServletRequest request,HttpServletResponse response){
String userInfo = userService.getUserInfoById(1);
return userInfo;
} }
spring集成Hessian的基本使用方法的更多相关文章
- Spring集成Hessian
一.概述 Spring 通过org.springframework.remoting.caucho.HessianServiceExporter将POJO中的所有public方法发布为Hessian服 ...
- spring集成JPA的三种方法配置
JPA是Java EE5规范之一,是一个orm规范,由厂商来实现该规范.目前有hibernate,OpenJPA,TopLink和EclipseJPA等实现 spring提供三种方法集成JPA:1.L ...
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)
Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)
硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...
- axis2+spring集成
转载自:http://www.cnblogs.com/linjiqin/archive/2011/07/05/2098316.html 1.新建一个web project项目,最终工程目录如下: 注意 ...
- rabbitMQ第五篇:Spring集成RabbitMQ
前面几篇讲解了如何使用rabbitMq,这一篇主要讲解spring集成rabbitmq. 首先引入配置文件org.springframework.amqp,如下 <dependency> ...
- spring集成常用技术的配置
使用spring集成其他技术,最基本的配置都是模板化的,比如配置视图模板引擎.数据库连接池.orm框架.缓存服务.邮件服务.rpc调用等,以spring的xml配置为例,我将这些配置过程整理出来,并不 ...
- Activiti工作流学习(三)Activiti工作流与spring集成
一.前言 前面Activiti工作流的学习,说明了Activiti的基本应用,在我们开发中可以根据实际的业务参考Activiti的API去更好的理解以及巩固.我们实际的开发中我们基本上都使用sprin ...
- 重构Mybatis与Spring集成的SqlSessionFactoryBean(1)
一般来说,修改框架的源代码是极其有风险的,除非万不得已,否则不要去修改.但是今天却小心翼翼的重构了Mybatis官方提供的与Spring集成的SqlSessionFactoryBean类,一来是抱着试 ...
随机推荐
- 使用Java泛型返回动态类型
返回一个指定类型的集合,并且clazz必须继承IGeoLog对象或者是其本身 <T extends IGeoLog> List<T> getLogListSql(Class&l ...
- Codeforces 719A 月亮
参考自:https://www.cnblogs.com/ECJTUACM-873284962/p/6395221.html A. Vitya in the Countryside time limit ...
- Python中pandas模块解析
Pandas基于两种数据类型: series 与 dataframe . 1.Series 一个series是一个一维的数据类型,其中每一个元素都有一个标签.类似于Numpy中元素带标签的数组.其中, ...
- android最最基础简单的保存xml代码
y偶遇非常基础,我想直接上代码: MainActivity.java: package com.lgqchinese.xmlcreate; import android.support.v7.app. ...
- Python3入门基础--str常用方法
Python基础之String常用方法 str():将其他类型的变量转换为str类型,例如: name = 'Jack' age = 22 course = ['web','Java','mysql' ...
- Matplotlib学习---用matplotlib和sklearn画拟合线(line of best fit)
在机器学习中,经常要用scikit-learn里面的线性回归模型来对数据进行拟合,进而找到数据的规律,从而达到预测的目的.用图像展示数据及其拟合线可以非常直观地看出拟合线与数据的匹配程度,同时也可用于 ...
- AtCoder Regular Contest 102 E Stop. Otherwise...
题目链接:atcoder 大意:有\(n\)个骰子,每个骰子上面有\(k\)个数,分别是\(1\text ~ k\),现在求\(\forall i\in[2...2k]\),求出有多少种骰子点数的组合 ...
- luogu1397 [NOI2013]矩阵游戏 (等比数列求和)
一个比较显然的等比数列求和,但有一点问题就是n和m巨大.. 考虑到他们是在幂次上出现,所以可以模上P-1(费马小定理) 但是a或c等于1的时候,不能用等比数列求和公式,这时候就要乘n和m,又要变成模P ...
- [NOI2010]海拔(最小割)
题目描述 YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作一个 正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个 ...
- [SCOI2014]方伯伯的OJ(线段树)
方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题.Oj上注册了n个用户,编号为1-n“,一开始他们按照编号排名. 方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和编号: 1.操作格式为 ...