spring集成Hessian的基本使用方法

Easter79
• 阅读 423

一、什么是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;
    }
    
}
点赞
收藏
评论区
推荐文章
刚刚好 刚刚好
2个月前
css问题
1、 在IOS中图片不显示(给图片加了圆角或者img没有父级) <div<img src""/</div div {width: 20px; height: 20px; borderradius: 20px; overflow: h
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
晴空闲云 晴空闲云
2个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。 盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
1个月前
快速入门|使用MemFire Cloud构建React Native应用程序
> MemFire Cloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Easter79 Easter79
1年前
Twitter的分布式自增ID算法snowflake (Java版)
概述 == 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。 有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。 而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序 select * from table_name order id desc; 2.按照指定(多个)字段排序 select * from table_name order id desc,status desc; 3.按照指定字段和规则排序 selec
Wesley13 Wesley13
1年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表: **时辰** **时间** **24时制** 子时 深夜 11:00 - 凌晨 01:00 23:00 - 01 :00 丑时 上午 01:00 - 上午 03:00 01:00 - 03 :00 寅时 上午 03:00 - 上午 0
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
#### 背景描述 # Time: 2019-01-24T00:08:14.705724+08:00 # User@Host: **[**] @ [**] Id: ** # Schema: sentrymeta Last_errno: 0 Killed: 0 # Query_time: 0.315758 Lock_
helloworld_28799839 helloworld_28799839
2个月前
常用知识整理
# Javascript ## 判断对象是否为空 ```js Object.keys(myObject).length === 0 ``` ## 经常使用的三元运算 > 我们经常遇到处理表格列状态字段如 `status` 的时候可以用到 ``` vue
helloworld_34035044 helloworld_34035044
4个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。 uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid() 或 uuid(sep)参数说明:sep 布尔值,生成的uuid中是否包含分隔符'',缺省为