10

我試圖做使用RestTemplate的HttpClient(4.x版)文摘大部分(或基本)認證。RestTemplate基本或摘要式身份驗證與當前的HttpClient(4.x版)

因爲我無法找到如何真正做到這一點的任何相關的例子,我曾嘗試各種方式掛鉤的各種HttpClient的文物,沒有運氣 - 本質上,沒有認證頭在所有發送。

我目前的實現是:

DefaultHttpClient newHttpClient = new DefaultHttpClient(); 
Credentials credentials = new UsernamePasswordCredentials(username, password); 
AuthScope authScope = new AuthScope(host, port, AuthScope.ANY_REALM); 
BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider(); 
credentialsProvider.setCredentials(authScope, credentials); 
newHttpClient.setCredentialsProvider(credentialsProvider); 

HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(newHttpClient); 
restTemplate.setRequestFactory(requestFactory); 

有什麼我做錯了嗎?這個地方還有一個可行的例子嗎? 任何幫助表示讚賞。 謝謝。

+0

你會發布更詳細的HTTP請求和響應日誌嗎?在嘗試對客戶端代碼進行故障排除之前,確認諸如身份驗證挑戰等事情會很有幫助。 – jtoberon 2012-02-28 19:03:45

+1

希望不應該有任何挑戰 - 我想要搶先認證。至於客戶端代碼 - 我真的在尋找任何使用Spring RestTemplate和HTTPClient(4.x)的設置。 – Eugen 2012-02-28 20:15:21

回答

9

嘗試實現您自己的RequestFactory以實現搶先認證。

public class PreEmptiveAuthHttpRequestFactory extends HttpComponentsClientHttpRequestFactory { 

public PreEmptiveAuthHttpRequestFactory(DefaultHttpClient client) { 
    super(client); 
} 

@Override 
protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { 
    AuthCache authCache = new BasicAuthCache(); 
    BasicScheme basicAuth = new BasicScheme(); 
    HttpHost targetHost = new HttpHost(uri.getHost(), uri.getPort()); 
    authCache.put(targetHost, basicAuth); 
    BasicHttpContext localcontext = new BasicHttpContext(); 
    localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache); 

    return localcontext; 
} 
} 

的就用它:

HttpComponentsClientHttpRequestFactory requestFactory = new PreEmptiveAuthHttpRequestFactory(newHttpClient); 

希望它可以幫助


如何設置用戶名和密碼(來自@ bifur的評論複製)

您可以使用UserNamePasswordCredentials

UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(getUsername(),getPassword()); 
client.getCredentialsProvider().setCredentials(new AuthScope(getHost(), getPort(), AuthScope.ANY_REALM), credentials); 

,只是使用的客戶端在以前工廠

HttpComponentsClientHttpRequestFactory requestFactory = new PreEmptiveAuthHttpRequestFactory(client); 
+0

我會給它一個去,讓你知道它是如何結果 - 謝謝。 – Eugen 2012-03-30 14:24:09

+0

快速跟進 - 用戶名和密碼的確切設置是什麼? – Eugen 2012-08-28 20:47:15

+3

您可以使用UserNamePasswordCredentials 'UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(getUsername(),getPassword()); 。 client.getCredentialsProvider()setCredentials方法(新AuthScope(和getHost()的getPort(),AuthScope.ANY_REALM),憑證);' ,只是使用的客戶端在以前工廠 'HttpComponentsClientHttpRequestFactory requestFactory =新PreEmptiveAuthHttpRequestFactory(客戶端); ' – bifur 2012-08-30 11:27:11

0

我修改了原來的答覆了一下:

  • 添加HTTPS支持
  • 更新depracated東西

    public class PreEmptiveAuthHttpRequestFactory extends HttpComponentsClientHttpRequestFactory { 
    
        public PreEmptiveAuthHttpRequestFactory(HttpClient client) { 
         super(client); 
        } 
    
        @Override 
        protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { 
         AuthCache authCache = new BasicAuthCache(); 
         BasicScheme basicAuth = new BasicScheme(); 
         HttpHost targetHost = new HttpHost(uri.getHost(), uri.getPort(), uri.getScheme()); 
         authCache.put(targetHost, basicAuth); 
         HttpClientContext localContext = HttpClientContext.create(); 
         localContext.setAuthCache(authCache); 
         return localContext; 
        } 
    }