2017-08-21 23 views
0

我需要將授權頭添加到來自客戶端的所有傳出請求中,並且我按照this的說明添加了ClientRequestFilter答案。從JAX RS客戶端刪除過濾器

現在我想改變我創建的過濾器的屬性。我試圖重新註冊過濾器的新副本,但沒有奏效。我試圖查看Client對象的可用方法,但沒有發現類似註銷或刪除的任何內容。

示例代碼:

Client client = ClientBuilder.newClient().register(new ClientObjectMapperProvider()); 
AuthTokenFilter authTokenFilter = new AuthTokenFilter(authTokenService, authConfig); 
     client.register(authTokenFilter); 
//make some requests 


//In another method in another class 
AuthTokenFilter newFilter = new AuthTokenFilter(authTokenService, newConfig); 
client.register(newFilter); 

//make more requests 

當我送註冊新的過濾器後的要求,我想在auth頭根據新的配置有所不同,但是這不會發生。

在進一步調查中,如果另一個相同類型已經註冊,客戶端對象似乎不會註冊一個對象。儘管如此,仍然沒有找到解除註冊的方法。

+0

*我試圖重新註冊過濾器的新副本,但是沒有工作*代碼在哪裏? – nullpointer

+0

@nullpointer我無法分享整個事情,因爲它分佈在多個文件中,並且有很多,但我已經編輯過包含基本想法。 – hoodakaushal

回答

1

創建客戶端實例相當重量級,因此您不希望經常這樣做,因此有意義的是您正在緩存和重新使用客戶端實例。

如果您只是希望爲每個目標端點設置一個單獨的認證過濾器,則不必在客戶端實例上進行註冊。在你實際談論任何事情之前,你需要創建一個WebTarget(它代表你要與之通信的具體端點)一旦你創建了WebTarget,你就可以用這個註冊你的過濾器。

配置網頁目標也可能相當重(see here) ,但它的確意味着您可以爲每個目標主機生成(並緩存)不同的身份驗證過濾器。

如果您想要根據某些已編輯的配置(例如屬性文件/配置REST端點)動態重新配置客戶端/ webtarget,那麼您可以簡單地擁有WebTarget/Client實例的緩存,變化。 (在丟棄任何舊客戶端實例之前,您需要記得致電client.close()

+0

這也是我的第一個想法,但由於我在各種方法中調用了很多不同的端點,我不想改變它們 - 這會破壞使用過濾器的整個觀點 - 以避免複製粘貼相同的代碼遍佈整個地方。 – hoodakaushal