zoukankan      html  css  js  c++  java
  • 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=

    学海无涯、何时是岸
  • 相关阅读:
    写代码如坐禅:你是哪一类程序员
    开发企业应用系统需要掌握的知识技能(转)
    (转)谈谈多线程的思维方式
    深入理解JavaScript定时机制
    (转)javascritp对fckeditor编辑器操作
    JavaScript异步编程的Promise模式
    (转)jquery调WCF
    (转)《代码大全》学习笔记:第10,11,12,13章 关于变量的使用,命名等
    编程:是一门艺术(转)
    禅修程序员十诫(转)
  • 原文地址:https://www.cnblogs.com/veblen/p/14703703.html
Copyright © 2011-2022 走看看