Java 为https和身份验证配置CloseableHttpClient(4.3)
Java 为https和身份验证配置CloseableHttpClient(4.3),java,android,spring,apache-httpclient-4.x,Java,Android,Spring,Apache Httpclient 4.x,我正在尝试通过https将android应用程序连接到我的rest服务器。 服务器使用spring引导运行,spring安全性使用jdbcAuthentication运行。我很确定问题不是来自服务器端 在android应用程序中,我使用restTemplate创建一个restClient,如下所示: import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials
我正在尝试通过https将android应用程序连接到我的rest服务器。
服务器使用spring引导运行,spring安全性使用jdbcAuthentication运行。我很确定问题不是来自服务器端
在android应用程序中,我使用restTemplate创建一个restClient,如下所示:
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
public class RestClient extends RestTemplate {
public RestClient(String username, String password) {
CloseableHttpClient httpClient = null;
try {
SSLContextBuilder sslContextBuilder = new SSLContextBuilder();
sslContextBuilder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContextBuilder.build());
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(new AuthScope("localhost", 443, AuthScope.ANY_REALM), new UsernamePasswordCredentials(username, password));
httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).setDefaultCredentialsProvider(credsProvider).build();
getMessageConverters().add(new MappingJackson2HttpMessageConverter());
setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
} catch (NoSuchAlgorithmException e) {
Log.e("NoSuchAlgorithmEx", e.getMessage());
} catch (KeyStoreException e) {
Log.e("KeyStoreException", e.getMessage());
} catch (KeyManagementException e) {
Log.e("KeyManagementException", e.getMessage());
}
}
public static <T> T getItem(String url, Class<T> type, String username, String password) {
RestClient restClient = new RestClient(username, password);
return restClient.getForObject(url, type);
}
}
如果我在selectedUrl上使用.permitAll()禁用服务器端的身份验证,一切都很正常
如果启用身份验证,android应用程序将无法连接到服务器。
“无法提取响应:未找到适合响应类型的HttpMessageConverter”
在android方面,我使用的是
compile 'org.springframework.android:spring-android-rest-template:2.0.0.M1'
compile 'org.apache.httpcomponents:httpclient-android:4.3.5'
我认为问题来自于我的httpClient的配置,但我看不出具体是什么
如果你们有任何线索…你能找到这个吗?
compile 'org.springframework.android:spring-android-rest-template:2.0.0.M1'
compile 'org.apache.httpcomponents:httpclient-android:4.3.5'