IoFilter是MINA的核心組成部分,它提供了重要的規則.它過來全部在IoService和IoHandler之間的I/O事件和請求.若是你有過相關的Web應用開發經驗,你能夠把它簡單的想象成Servlet過濾器的"兄弟".許多開箱即用的過濾器被提供用來促進網絡應用開發速度,經過使用這些過濾器,能夠簡化典型的橫向關注點,例如:java
1.LoggingFilter 記錄全部的事件和請求web
2.ProtocolCodecFilter 將輸入的字節流轉化成簡單的消息對象,反之亦然網絡
3.CompressionFilter 壓縮數據session
4.SSLFilter 添加SSL-TLS-StartTLS支持app
5.更多...ide
你能夠繼承IoAdapter類來替代直接實現IoFilter接口.除非覆蓋方法,否則全部收到的事件將被轉直接轉發到下一個過濾器.spa
//除非你想本身實現全部相關方法,否則繼承IoFilterAdapter是更簡單的作法 public class MyFilter extends IoFilterAdapter { // 須要注意的是,sessionCreated事件必須在I/O Processor線程中執行,不能轉發給其餘線程 @Override public void sessionCreated(NextFilter nextFilter, IoSession session) throws Exception { nextFilter.sessionCreated(session); } @Override public void sessionOpened(NextFilter nextFilter, IoSession session) throws Exception { nextFilter.sessionOpened(session); } // ProtocolCodecFilter使用空緩衝區來做爲一個內部信號,因此,當自定義Filter被放置在ProtocolCodecFilter以前時,須要進行以下判斷 @Override public void filterWrite(NextFilter nextFilter, IoSession session, WriteRequest request) { Object message = request.getMessage(); if (message instanceof ByteBuffer && !((ByteBuffer) message).hasRemaining()) { nextFilter.filterWrite(session, request); return; } } @Override public void messageSent(NextFilter nextFilter, IoSession session, WriteRequest request) throws Exception { Object message = request.getMessage(); if (message instanceof ByteBuffer && !((ByteBuffer) message).hasRemaining()) { nextFilter.messageSent(session, request); return; } } }
備註:線程
官方文檔說明中描述,若是你的過濾器對輸入輸出對象作了類型轉換,那麼你必需要同時實現filterWrite和messageSent,若是你的過濾器沒有作這樣的轉換,也建議這樣實現....綜上所述,自定義過濾器直接實現這兩個方法.(我是這麼理解的...)code
下面給出原文:orm
If you are going to transform an incoming write request via IoSession.write(), things can get pretty tricky. For example, let's assume your filter transforms HighLevelMessage to LowLevelMessage when IoSession.write() is invoked with a HighLevelMessage object. You could insert appropriate transformation code to your filter's filterWrite() method and think that's all. However, you have to note that you also need to take care of messageSent event because an IoHandler or any filters next to yours will expect messageSent() method is called with HighLevelMessage as a parameter, because it's irrational for the caller to get notified that LowLevelMessage is sent when the caller actually wrote HighLevelMessage. Consequently, you have to implement both filterWrite() and messageSent() if your filter performs transformation.
Please also note that you still need to implement similar mechanism even if the types of the input object and the output object are identical (e.g. CompressionFilter) because the caller of IoSession.write() will expect exactly what he wrote in his or her messageSent() handler method.