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