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=


__EOF__

本文作者veblenJan°
本文链接https://www.cnblogs.com/veblen/p/14703703.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   venblenJan°  阅读(175)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示