2017-07-02 120 views
0

我無法將NTLN身份驗證添加到使用Jersey和Apache HttpClient的現有應用程序。我只能使用JCIFS進行身份驗證,來自HttpClient的默認NTLM身份驗證不起作用(我獲得401)。JCIFS可以和Jersey一起使用嗎?

Apache的HttpClient的頁面的例子說明了如何使用CloseableHttpClient: https://hc.apache.org/httpcomponents-client-4.5.x/ntlm.html

Registry<AuthSchemeProvider> authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create() 
    .register(AuthSchemes.NTLM, new JCIFSNTLMSchemeFactory()) 
    .register(AuthSchemes.BASIC, new BasicSchemeFactory()) 
    .register(AuthSchemes.DIGEST, new DigestSchemeFactory()) 
    .register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory()) 
    .register(AuthSchemes.KERBEROS, new KerberosSchemeFactory()) 
    .build(); 
CloseableHttpClient httpClient = HttpClients.custom() 
    .setDefaultAuthSchemeRegistry(authSchemeRegistry) 
    .build(); 

但隨着CloseableHttpClient我無法使用方法,如target

WebTarget target = client.target(this.my Address).path(elementPath) 
      .resolveTemplate(P_ID, myId); 

只有execute

我不知道我是否應該重寫我的整個應用程序,並且只使用基本的HttpClient調用,如:

HttpGet httpGet = new HttpGet(repositoryAddress + "/" + "element/70032_1498404600000(,,arm)"); 
CloseableHttpResponse response = httpClient.execute(httpGet); 

或者有一些其他的方式來設置AuthSchemes在javax.ws.rs.client.Client,可以在新澤西州被使用?

回答

2

我面臨着類似的問題,我的方法是如下:

1)如果您正在使用ApacheConnectorProvider作爲連接器,您可以覆蓋ApacheConnector代碼(在這裏https://github.com/jersey/jersey/tree/master/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector找到)。在我的情況下,我不得不創建自定義ConnectorProvider和連接器。

2)創建一個自定義屬性或使用HttpClientContext.AUTHSCHEME_REGISTRY並將其放入ClientConfig(這是我們如何在Jersey Client中爲客戶端設置屬性)。

3)調用builder.get(或發佈或任何其他方法)時調用自定義連接器。在自定義連接器中,您可以檢查上述步驟中設置的屬性。如果已設置,則可以像爲ClosableHttpClient指定的那樣設置DefaultAuthSchemeRegistry(ApacheConnector在其實現中使用ClosableHttpClient)。

這可能是一種黑客,但工作正常。希望這有助於:)

相關問題