import android.util.Log; import java.io.IOException; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.concurrent.TimeUnit; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class okhttp3_redirectToHttps { String url = ""; static OkHttpClient okHttpClient; static OkHttpClient.Builder builder = new OkHttpClient().newBuilder(); static { builder.connectTimeout(30, TimeUnit.SECONDS); builder.readTimeout(30, TimeUnit.SECONDS); builder.writeTimeout(30, TimeUnit.SECONDS); // okHttpClient.interceptors().add(new LoggingInterceptor()); //爲false就是自定義重定向,true 就是自己內部就重定向了,只返回最後就結果 builder.followRedirects(false); trustAllHosts();//設置忽略安全證書驗證 // 實現HostnameVerifier接口,不進行url和服務器主機名的驗證。 builder.hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); okHttpClient = builder.build(); } public static String run(String url) throws IOException { Request request = new Request.Builder().url(url).get().build(); Response response = okHttpClient.newCall(request).execute(); Log.e("response.code()", "" + response.code()); // Log.e("httpUrl", "" + response.request().httpUrl()); // Log.e("response.body()", "" + response.body().string()); Log.e("Location", "" + response.headers().get("Location")); // Log.e("headers", "" + request.url()); int code = response.code(); if (code == 302) { String location = response.headers().get("Location"); run(location); } else if (response.isSuccessful()) { return response.body().string(); } else { throw new IOException("Unexpected code " + response); } return ""; } public static void trustAllHosts() { // Create a trust manager that does not validate certificate chains // Android use X509 cert, 基於上面實現的TrustAllCertsManager修改Http類的默認SSL socket factory。 TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; } public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } }}; // Install the all-trusting trust manager try { SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, trustAllCerts, new SecureRandom()); // okHttpClient.setSslSocketFactory(sc.getSocketFactory()); // sslContext.init(null, null, null); builder.sslSocketFactory(sc.getSocketFactory()); } catch (Exception e) { e.printStackTrace(); } } }
在主程序中
okhttp3_redirectToHttps.run(url);