2016-07-18 51 views
1

我目前正在使用Spring Integration從隊列中獲取消息並使用服務激活器將消息發送給服務。我的問題是,我所調用的服務需要爲當前線程安裝一個安全上下文。這可以通過調用另一個bean的無參數方法handleAuthentication()來設置。我想知道在調用服務激活器服務之前,每當收到新消息時調用此方法的最佳方法是什麼?我原本以爲我會連接兩個服務激活器,第一個調用handleAuthentication(),但這看起來不正確,因爲handleAuthentication()不需要來自實際消息的任何信息。如何使用Spring集成收到消息時調用安全設置

回答

1

是的,你對安全處理的假設是正確的。這實際上只是一個副作用方面,不應該與業務邏輯聯繫在一起。

因此,我們應該使用一些東西,使我們能夠遵循程序中的相同行爲。它在編程中也被稱爲Aspect

爲此目的,Spring集成建議使用類似MessageChannelInterceptor的掛鉤,根據您的解釋,您可以在preReceive()回調中正確實施handleAuthentication()

另一個技巧可以通過<request-handler-advice-chain>MethodInterceptor實現來實現,該實現應該在目標服務調用之前將SecurityContext填充到當前線程中。

+0

我遇到了preReceive和postReceive如何工作的問題。每次查詢頻道時都會調用這些方法,無論是否存在消息。有沒有一種方法,只有在實際存在信息時纔會調用這些方法?否則,它將不斷地調用handleAuthentication()。 – user964210

+0

哦,對!如何在'postReceive()'回調中做同樣的事情? –

+0

'postReceive()'實際上在輪詢時也總是被調用。我通過查看org.springframework.integration.channel.AbstractPollableChannel的'receive(long timeout)'方法驗證了這一點。當沒有消息時,回調只收到回消息。 – user964210

相關問題