webview请求https

本文详细介绍了如何在Android应用中集成WebViewClient,并提供了具体的代码实现。包括复写关键方法如shouldOverrideUrlLoading来处理WebView加载链接的行为,创建网络请求及处理HTTPS连接,以及如何设置SSL证书等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:集成WebViewClient
复写

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (!isNewPager) {
        view.loadUrl(url);
        return !isNewPager;
    } else
        return isNewPager;
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
    return shouldOverrideUrlLoading(view, request.getUrl().getPath());
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
    return this.shouldInterceptRequest(view, request.getUrl().getPath());
}

@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
    try {
        HttpURLConnection urlConnection = createConnection(url, "");
        InputStream is = urlConnection.getInputStream();
        String contentType = urlConnection.getContentType();
        String encoding = urlConnection.getContentEncoding();
        if (contentType != null) {
            String mimeType = contentType;
            if (contentType.contains(";")) {
                mimeType = contentType.split(";")[0].trim();
            }
            return new WebResourceResponse(mimeType, encoding, is);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return super.shouldInterceptRequest(view, url);
}

2:创建网络请求

@Override
public HttpURLConnection createConnection(String url, Object extra) throws IOException {
    HttpURLConnection connection = createConnection(url, extra);
    if (connection instanceof HttpsURLConnection) {
        if (sslContext == null)
            try {
                sslContext = getSSLContext(OkHttpUtil.LCE);//证书地址
            } catch (Exception e) {
                e.printStackTrace();
            }
        if (sslContext == null)
            try {
                sslContext = getSSLContext();//不验证证书
            } catch (Exception e) {
                e.printStackTrace();
            }
        if (sslContext != null) {
            ((HttpsURLConnection) connection).setSSLSocketFactory(sslContext.getSocketFactory());
            ((HttpsURLConnection) connection).setHostnameVerifier((new HostnameVerifier() {
                @Override
                public boolean verify(String s, SSLSession sslSession) {
                    return true;
                }
            }));
        }
    }
    return connection;
}
protected HttpURLConnection createConnection(String url, Object extra) throws IOException {
    String encodedUrl = Uri.encode(url, "@#&=*+-_.,:!?()/~\'%");
    HttpURLConnection conn = (HttpURLConnection)(new URL(encodedUrl)).openConnection();
    conn.setConnectTimeout(this.connectTimeout);
    conn.setReadTimeout(this.readTimeout);
    return conn;
}


3:获取sll证书

public static SSLContext getSSLContext(String trustStorePath) throws Exception {
    // 实例化信任库
    TrustManagerFactory trustManagerFactory = TrustManagerFactory
            .getInstance(TrustManagerFactory.getDefaultAlgorithm());
    // 获得信任库
    KeyStore trustStore = getKeyStore(trustStorePath);//证书位置
    // 初始化信任库
    trustManagerFactory.init(trustStore);
    // 实例化SSL上下文
    SSLContext ctx = SSLContext.getInstance("TLS");
    // 初始化SSL上下文
    ctx.init(null,
            trustManagerFactory.getTrustManagers(), new SecureRandom());
    // 获得SSLSocketFactory
    return ctx;
}


private static final KeyStore getKeyStore(String c) throws CertificateException, KeyStoreException, IOException, NoSuchAlgorithmException {
    InputStream is = context.getAssets().open(c);
    CertificateFactory cerFactory = CertificateFactory.getInstance("X.509");
    Certificate cer = cerFactory.generateCertificate(is);
    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    keyStore.load(null, null);
    keyStore.setCertificateEntry(c, cer);
    if (is != null)
        is.close();
    return keyStore;
}
public static final SSLContext getSSLContext() throws Exception {
    TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
        @Override
        public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws CertificateException {

        }

        @Override
        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String s) throws CertificateException {

        }

        @Override
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return new java.security.cert.X509Certificate[0];
        }
    }};

    SSLContext sc = SSLContext.getInstance("TLS");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    return sc;
}
 

4:给webView设置WebViewClient       就ok
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值