okhttp3 http 重定向到 https


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);
發佈了1 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章