TCP 連線攔截器

您可以設定連線工廠,並參考 TcpConnectionInterceptorFactoryChain。您可以使用攔截器為連線新增行為,例如協商、安全性和其他選項。框架目前未提供任何攔截器,但請參閱來源儲存庫中的 InterceptedSharedConnectionTests 以取得範例。

測試案例中使用的 HelloWorldInterceptor 運作方式如下:

攔截器首先使用用戶端連線工廠進行設定。當第一個訊息透過攔截連線傳送時,攔截器會透過連線傳送 'Hello',並預期收到 'world!'。當這種情況發生時,協商完成,並傳送原始訊息。此外,使用相同連線的訊息會在沒有任何額外協商的情況下傳送。

當使用伺服器連線工廠設定時,攔截器要求第一個訊息必須是 'Hello',如果是,則傳回 'world!'。否則,它會擲回例外狀況,導致連線關閉。

所有 TcpConnection 方法都會被攔截。攔截器執行個體由攔截器工廠針對每個連線建立。如果攔截器是有狀態的,則工廠應為每個連線建立新的執行個體。如果沒有狀態,則相同的攔截器可以包裝每個連線。攔截器工廠會新增至攔截器工廠鏈的設定中,您可以透過設定 interceptor-factory 屬性將其提供給連線工廠。攔截器必須擴充 TcpConnectionInterceptorSupport。工廠必須實作 TcpConnectionInterceptorFactory 介面。TcpConnectionInterceptorSupport 具有直通方法。透過擴充此類別,您只需要實作您想要攔截的那些方法。

以下範例顯示如何設定連線攔截器工廠鏈:

<bean id="helloWorldInterceptorFactory"
    class="o.s.i.ip.tcp.connection.TcpConnectionInterceptorFactoryChain">
    <property name="interceptors">
        <array>
            <bean class="o.s.i.ip.tcp.connection.HelloWorldInterceptorFactory"/>
        </array>
    </property>
</bean>

<int-ip:tcp-connection-factory id="server"
    type="server"
    port="12345"
    using-nio="true"
    single-use="true"
    interceptor-factory-chain="helloWorldInterceptorFactory"/>

<int-ip:tcp-connection-factory id="client"
    type="client"
    host="localhost"
    port="12345"
    single-use="true"
    so-timeout="100000"
    using-nio="true"
    interceptor-factory-chain="helloWorldInterceptorFactory"/>