-
Notifications
You must be signed in to change notification settings - Fork 187
Hprose 过滤器
小马哥 edited this page Jul 2, 2016
·
9 revisions
有时候,我们可能会希望在远程过程调用中对通讯的一些细节有更多的控制,比如对传输中的数据进行加密、压缩、签名、跟踪、协议转换等等,但是又希望这些工作能够跟服务函数/方法本身可以解耦。这个时候,Hprose 过滤器就是一个不错的选择。
Hprose 过滤器是一个接口,它定义在 hprose.common 包中,它有两个方法,该接口定义如下:
public interface HproseFilter {
ByteBuffer inputFilter(ByteBuffer data, HproseContext context);
ByteBuffer outputFilter(ByteBuffer data, HproseContext context);
}
其中 inputFilter 的作用是对输入数据进行处理,outputFilter 的作用是对输出数据进行处理。
data 参数就是输入输出数据。这两个方法的返回值表示已经处理过的数据,如果你不打算对数据进行修改,你可以直接将 data 参数作为返回值返回。
context 参数是调用的上下文对象,我们在服务器和客户端的介绍中已经多次提到过它。
不论是客户端,还是服务器,都可以添加多个过滤器。假设我们按照添加的顺序把它们叫做 filter1
, filter2
, ... filterN
。那么它们的执行顺序是这样的。
+------------------- outputFilter -------------------+
| +-------+ +-------+ +-------+ |
| |filter1|----->|filter2|-----> ... ----->|filterN| |---------+
| +-------+ +-------+ +-------+ | v
+----------------------------------------------------+ +---------------+
| Hprose Server |
+-------------------- inputFilter -------------------+ +---------------+
| +-------+ +-------+ +-------+ | |
| |filter1|<-----|filter2|<----- ... <-----|filterN| |<--------+
| +-------+ +-------+ +-------+ |
+----------------------------------------------------+
+-------------------- inputFilter -------------------+
| +-------+ +-------+ +-------+ |
+-------->| |filterN|-----> ... ----->|filter2|----->|filter1| |
| | +-------+ +-------+ +-------+ |
+---------------+ +----------------------------------------------------+
| Hprose Client |
+---------------+ +------------------- outputFilter -------------------+
^ | +-------+ +-------+ +-------+ |
+---------| |filterN|<----- ... <-----|filter2|<-----|filter1| |
| +-------+ +-------+ +-------+ |
+----------------------------------------------------+
有时候我们在调试过程中,可能会需要查看输入输出数据。用抓包工具抓取数据当然是一个办法,但是使用 过滤器可以更方便更直接的显示出输入输出数据。
LogFilter.java
package hprose.example.filter.log;
import hprose.common.HproseContext;
import hprose.common.HproseFilter;
import hprose.util.StrUtil;
import java.nio.ByteBuffer;
import java.util.logging.Level;
import java.util.logging.Logger;
public class LogFilter implements HproseFilter {
private static final Logger logger = Logger.getLogger(LogFilter.class.getName());
@Override
public ByteBuffer inputFilter(ByteBuffer data, HproseContext context) {
logger.log(Level.INFO, StrUtil.toString(data));
return data;
}
@Override
public ByteBuffer outputFilter(ByteBuffer data, HproseContext context) {
logger.log(Level.INFO, StrUtil.toString(data));
return data;
}
}
Server.java
package hprose.example.filter.log;
import hprose.server.HproseTcpServer;
import java.io.IOException;
import java.net.URISyntaxException;
public class Server {
public static String hello(String name) {
return "Hello " + name + "!";
}
public static void main(String[] args) throws URISyntaxException, IOException {
HproseTcpServer server = new HproseTcpServer("tcp://0.0.0.0:8082");
server.add("hello", Server.class);
server.addFilter(new LogFilter());
server.start();
System.out.println("START");
System.in.read();
server.stop();
System.out.println("STOP");
}
}
Client.java
package hprose.example.filter.log;
import hprose.client.HproseClient;
import java.io.IOException;
import java.net.URISyntaxException;
interface IHello {
String hello(String name);
}
public class Client {
public static void main(String[] args) throws URISyntaxException, IOException {
HproseClient client = HproseClient.create("tcp://127.0.0.1:8082");
client.addFilter(new LogFilter());
IHello h = client.useService(IHello.class);
System.out.println(h.hello("World"));
}
}
然后分别启动服务器和客户端,就会看到如下输出:
服务器输出
START
七月 02, 2016 11:32:19 上午 hprose.example.filter.log.LogFilter inputFilter
信息: Cs5"hello"a1{s5"World"}z
七月 02, 2016 11:32:19 上午 hprose.example.filter.log.LogFilter outputFilter
信息: Rs12"Hello World!"z
客户端输出
七月 02, 2016 11:32:19 上午 hprose.example.filter.log.LogFilter outputFilter
信息: Cs5"hello"a1{s5"World"}z
七月 02, 2016 11:32:19 上午 hprose.example.filter.log.LogFilter inputFilter
信息: Rs12"Hello World!"z
Hello World!
上面的例子,我们只使用了一个过滤器。在本例中,我们展示多个过滤器组合使用的效果。
Hprose for Java 用户手册