SessionFilter顺序

 

在实现Cindy 3.0a3 SSLFilter的过程中,发现一个有意思的问题:不同类型的SessionFilter对于过滤事件的顺序有着不同的要求。
 
假设有这么一个场景,通过SSL连接接收和发送数据,并统计所有的网络流量。
 
对于接收而言,SessionFilter的顺序应该是:
Received Packet --> StatisticFilter  --> SSLFilter --> Application Packet
这样统计到的是真实的接收流量,应用拿到的也是解码后的数据。
 
对于发送而言,SessionFilter的顺序则应该是:
Application Packet --> SSLFilter --> StatisticFilter --> Send Packet
可以看到,对于发送和接收而言,这两个Filter的顺序是相反的。如果这个场景再复杂一些,数据发送前需要先进行压缩,接收到数据后再解压缩,那么从发送到接收的整个流程是(红色是发送,蓝色是接收):
Application --> ZipFilter --> SSLFilter --> StatisticFilter --> Network --> StatisticFilter --> SSLFilter --> ZipFilter --> Application
可以看到在这些场景中,Filter在处理发送和接收事件上顺序是相反的。而在以前Cindy的设计里面,对于所有事件的分发都是按照相同的顺序,这可能造成困惑。
 
目前我的想法是,针对 应用层 的Filter, 将所有的send/sent事件分发按照Filter添加的顺序反向分发,其他的事件则按照添加顺序分发 。 但这种做法缺乏灵活性,因为这暗示了所有Filter需要的就是这种顺序(虽然目前除了系统级的Filter外,我还没想到什么样的Filter处理发送 和接收事件的顺序需要保持一致)。另一种做法可以把所有事件都拆分开,指定每个事件的处理顺序,但这种做法言应该会过于繁琐。
 
目前Cindy内系统级Filter对发送和接收事件分发的顺序需要保持一致。如果在上面这个流程图中加入系统级Filter,那么整个顺序是这样的(红色代表系统级Filter)
发送:Application --> ExecutorFilter --> ZipFilter --> SSLFilter --> StatisticFilter --> PacketDecoderFilter --> SessionHandlerFilter
 
接收:Network --> ExecutorFilter --> StatisticFilter --> SSLFilter --> ZipFilter --> PacketDecoderFilter --> SessionHandlerFilter
虽然这种全部反向分发接收事件的做法还有待商榷,但可以肯定的是,该做法比原来所有顺序一致的做法要好,因为反向分发至少覆盖了大部分的应用类型。
 
如果你来设计,你会怎么做呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值