配置CloseableHttpClient(4.3)以进行https和身份验证

时间:2015-05-19 12:26:33

标签: java android spring apache-httpclient-4.x


我试图通过https将Android应用程序连接到我的休息服务器。
服务器使用jdbcAuthentication运行spring boot和spring security。我很确定问题不是来自服务器端。

在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);
        }

    }

我这样用它:

MyObject myObject= RestClient.getItem(url, MyObject.class,"username","pasword");

如果我在服务器端使用selectUrl上的.permitAll()禁用身份验证,则一切正常。

如果我启用身份验证,Android应用程序无法连接到服务器。 &#34;无法提取响应:没有为响应类型找到合适的HttpMessageConverter&#34;

在android方面我使用

compile 'org.springframework.android:spring-android-rest-template:2.0.0.M1'
compile 'org.apache.httpcomponents:httpclient-android:4.3.5'

我认为问题来自我的httpClient的配置,但我无法看到什么。

如果你们有任何线索......

0 个答案:

没有答案