tigase – Packet过滤(九)
Packet过滤API Tigase为所有组件都提供了一个packet过滤API。你可以分别过滤传入和传出packet。
通过学习过滤,我们可以知道如何对packet进行拦截,如何修改packet内容,如何彻底得屏蔽packet。通过屏蔽,我们可以让packet跳过后续的处理过程,也可以彻底抛弃它。
packet的过滤基于PacketFilterIfc接口,请参考接口的javadoc来获取全部细节。过滤的主要方法是Packet filter(Packet packet),它以packet作为入口参数并对其进行处理,里面可以填写代码,针对packet的特定内容进行报警(如果后续处理忽视被报警的内容,可以有效的减小系统负载),并最终产生一个传出Packet用来做后续处理。如果传出的packet为null,说明这个包已经被屏蔽,它不需要再进行任何的后续处理;否则它会传出最原始的packet实例(即传入packet)或者是传入packet副本的修改版本。
需要强调的是:即使Packet对象不是immutable的,我们也绝不建议对已经存在的Packet实例做任何修改。这是因为Packet实例可能同时被其他的组件或线程进行处理,对Packet实例所做的任何修改,都可能产生不可预估的后果。
请参考PacketCounter的代码,它是用来统计不同类型packet个数的简单过滤器。在缺省情况下它会被所有组件加载,用来绘制packet的流量图。你可以获得各个类型消息的统计个数,可以获得packet发源地的消息个数,packet途径地的消息个数等等。
这是因为过滤器自己可以产生统计数据,并且Tigase内嵌的统计监控机制可以访问到这些数据。如果要充分利用内嵌的统计监控功能,过滤器需要实现void getStatistics(StatisticsList list)方法。这个方法缺省状态可能是空的,但你可以在里面填写代码,产生统计数据并把它们添加到列表当中,请参考PacketCounter代码。
配置 过滤器是可配置的,多个过滤器可以在Tigase服务器中多个组件中分别进行配置,且传入packet和传出packet可依据配置分别进行过滤。这为开发者控制Tigase服务器中的数据流量提供极大的灵活性。比如你可以加载一些特定的packet过滤器,阻止一些特别的消息来源向用户发送消息。你也可以过滤一些会导致消耗大量系统资源的packet来减轻系统负载。
缺省的配置信息会让每一个组件都加载同一个过滤器——PacketCounter,它作用于传入和传出方向。
message-router/incoming-filters=tigase.server.filters.PacketCounter message-router/outgoing-filters=tigase.server.filters.PacketCounter sess-man/incoming-filters=tigase.server.filters.PacketCounter sess-man/outgoing-filters=tigase.server.filters.PacketCounter c2s/incoming-filters=tigase.server.filters.PacketCounter c2s/outgoing-filters=tigase.server.filters.PacketCounter s2s/incoming-filters=tigase.server.filters.PacketCounter s2s/outgoing-filters=tigase.server.filters.PacketCounter bosh/incoming-filters=tigase.server.filters.PacketCounter bosh/outgoing-filters=tigase.server.filters.PacketCounter muc/incoming-filters=tigase.server.filters.PacketCounter muc/outgoing-filters=tigase.server.filters.PacketCounter
假如你实现了一个自己的过滤器——垃圾信息过滤器(com.company.SpamBlocker)。你希望关闭所有组件的PacketCounter过滤器,只有message router保持原状态(开启);并在connection manager上安装垃圾信息过滤器。
需要注意的是:在connection manager里,传入和传出可能并不是你所想像的那样,而是恰恰相反。
传入:是message router提交给组件的packet流向,这些packet需要进行后续的处理。对connection manager而言,后续的处理意味着需要把packet发送出网络。 传出:是组件产生的结果packet流向,这些packet从组件发出并被提交给message router,message router决定将这些packet发送到哪里并进行后续的处理。对于connection manager而言,传出方向是从网络当中获取packet。 根据上面的解释,我们需要把垃圾信息过滤器部署到所有connection manager的传出方向。也许你还有第二个需求,即比较bosh连接和标准的c2s连接各自产生的packet流量,那么我们可以开启connection manager上的PacketCounter过滤器。下面是我们开启connection manager的垃圾过滤器,并开启message router和connection manager上的PacketCounter的配置信息:
message-router/incoming-filters=tigase.server.filters.PacketCounter message-router/outgoing-filters=tigase.server.filters.PacketCounter sess-man/incoming-filters= sess-man/outgoing-filters= c2s/incoming-filters=tigase.server.filters.PacketCounter c2s/outgoing-filters=tigase.server.filters.PacketCounter,com.company.SpamBlocker s2s/incoming-filters= s2s/outgoing-filters=com.company.SpamBlocker bosh/incoming-filters=tigase.server.filters.PacketCounter bosh/outgoing-filters=tigase.server.filters.PacketCounter,com.company.SpamBlocker
muc/incoming-filters= muc/outgoing-filters=