okhttp和webview跳过https证书验证

本文介绍了如何在Android应用中使用OkHttp绕过HTTPS证书验证,并提供了WebView跳过证书验证的具体实现方法。
一.okhttp跳过验证写法:
import android.graphics.Bitmap;
import android.util.Log;
import android.widget.TextView;

import com.csht.yellow.application.MyApplication;
import java.io.IOException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
 * Created by Administrator on 2017/9/22.
 */

public class NetWorkOkhttp {

    
    public static void getONetWorkString(String Url) {

        OkHttpClient build = new OkHttpClient.Builder()
                .sslSocketFactory(createSSLSocketFactory())
                .hostnameVerifier(new TrustAllHostnameVerifier())
                .build();
        final String  url  = Url;//带https的网址
        final Request request = new Request.Builder().url(url).build();
        Call call    = build.newCall(request);

        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.i("joker", e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response)
                    throws IOException
            {
                
            }
        });
    }

    

    private static class TrustAllCerts implements X509TrustManager {
        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}

        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}

        @Override
        public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}
    }
    private static class TrustAllHostnameVerifier implements HostnameVerifier {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    }

    private static SSLSocketFactory createSSLSocketFactory() {
        SSLSocketFactory ssfFactory = null;
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null,  new TrustManager[] { new TrustAllCerts() }, new SecureRandom());
            ssfFactory = sc.getSocketFactory();
        } catch (Exception e) {
        }

        return ssfFactory;
    }


}

二.webview跳过证书验证写法:
//设置WebViewClient时,重写onReceivedSslError,在里面添加这句话handler.proceed(); 
webView.setWebViewClient(new WebViewClient() {
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){
        handler.proceed();  // 接受所有网站的证书
    }
}




                
package com.example.layoutdome; import androidx.appcompat.app.AppCompatActivity; import androidx.work.ExistingPeriodicWorkPolicy; import androidx.work.PeriodicWorkRequest; import androidx.work.WorkManager; import android.annotation.SuppressLint; import android.content.Context; import android.media.AudioManager; import android.media.MediaPlayer; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.util.Log; import android.webkit.JavascriptInterface; import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.MediaController; import android.widget.TextView; import android.widget.Toast; import android.widget.VideoView; import com.example.StyleWorker; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.TrackSelector; import java.io.File; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; import java.util.concurrent.TimeUnit; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import okio.BufferedSource; import okio.ByteString; public class MainActivity3 extends AppCompatActivity implements StyleRequest.OnStyleRequestListener { private WebView webView, topWebView; private TextView tvMarquee; private FullScreenVideoView videoView; private String url; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); webView = findViewById(R.id.web); topWebView = findViewById(R.id.webView); tvMarquee = (TextView) findViewById(R.id.tv_marquee); videoView = (FullScreenVideoView) findViewById(R.id.video); // 1. 立即执行一次请求 new StyleRequest(this).execute(); // 2. 设置周期性任务:每 30 分钟执行一次 PeriodicWorkRequest styleWork = new PeriodicWorkRequest.Builder(StyleWorker.class, 30, TimeUnit.MINUTES) .build(); WorkManager.getInstance(this).enqueueUniquePeriodicWork( "StyleWork", ExistingPeriodicWorkPolicy.REPLACE, styleWork ); SetUpTheVideo(); SetUpMarquees(); SetUpTopTheWebPage(); // String audioUrl = "http://192.168.3.150:816/mp3?s="+12333; // playAudio( audioUrl); } @Override public void onStyleRequest(StyleList styleList) { String value = styleList.getData().getValue(); SetUpTheWebPage(value); Log.i("11111111111111111", "" + value); } private void SetUpTopTheWebPage() { // 启用 JavaScript WebSettings webSettings = topWebView.getSettings(); webSettings.setJavaScriptEnabled(true); // 启用 JS // 支持视口元数据(viewport),适配不同屏幕 webSettings.setUseWideViewPort(true); // 启用宽视口 webSettings.setLoadWithOverviewMode(true); // 缩放至适合屏幕 webSettings.setDomStorageEnabled(true); // 设置 WebChromeClient topWebView.setWebChromeClient(new WebChromeClient()); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); // 提高渲染优先级 webSettings.setJavaScriptCanOpenWindowsAutomatically(false); webSettings.setSupportMultipleWindows(false); webSettings.setBuiltInZoomControls(false); webSettings.setDisplayZoomControls(false); String url = "http://192.168.2.118:8088/#/header?deviceNo=ES01"; topWebView.loadUrl(url); } private void SetUpMarquees() { tvMarquee.setText("S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整理代码需要访问的数据地址S3.整"); tvMarquee.setSelected(true); // 必须设置为 selected 才能启动 marquee tvMarquee.setFocusable(true); tvMarquee.setFocusableInTouchMode(true); tvMarquee.requestFocus(); // 强制获取焦点 } private void SetUpTheVideo() { // 视频文件的路径 String videoPath = "/storage/emulated/0/Download/DEFAULT.mp4"; // 创建 File 对象 File videoFile = new File(videoPath); // 检查文件是否存在 if (videoFile.exists()) { // 文件存在 Toast.makeText(this, "文件存在", Toast.LENGTH_SHORT).show(); } else { // 文件不存在 Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show(); } // 设置视频路径 videoView.setVideoPath(videoPath); // 添加控制器 MediaController mediaController = new MediaController(this); mediaController.setAnchorView(videoView); videoView.setMediaController(mediaController); videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { // 播放视频 videoView.start(); } }); // 检查文件格式编码是否受支持 videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { if (what == MediaPlayer.MEDIA_ERROR_UNSUPPORTED) { } // 处理不支持的文件格式或编码 Log.e("VideoPlayer", "播放视频时发生错误. what: " + what + ", extra: " + extra); return false; } }); } @SuppressLint("SetJavaScriptEnabled") private void SetUpTheWebPage(String value) { WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setDomStorageEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); webSettings.setJavaScriptCanOpenWindowsAutomatically(false); webSettings.setSupportMultipleWindows(false); webSettings.setBuiltInZoomControls(false); webSettings.setDisplayZoomControls(false); // 注入接口对象 webView.addJavascriptInterface(new JavascriptBroadcastInterfaces(), "broadcast"); if (value.equals("0")) { // 加载网页 Log.i("1111111111111","加载网页"); url = "http://192.168.2.36:8088/#/electrStation/purpleTemp"; } else if (value.equals("1")) { // 'if' statement has empty body url = "http://192.168.2.36:8088/#/electrStation/greenTemp"; }else if (value.equals("2")) { // 'if' statement has empty body url = "http://192.168.2.36:8088/#/electrStation"; } // 设置 WebViewClient 以在应用内打开页面 webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { webView.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); webView.loadUrl(url); } public class JavascriptBroadcastInterfaces { private String lastBroadcast; // 保存上一次收到的 broadcast @JavascriptInterface public void getBroadcast(String broadcast) { Log.i("Broadcast", "Received broadcast: " + broadcast); // 如果新值上次相同,直接返回 if (broadcast != null && broadcast.equals(lastBroadcast)) { Log.i("Broadcast", "重复的 broadcast,跳过播放"); return; } // 更新 lastBroadcast 为新的值 lastBroadcast = broadcast; // 构造音频 URL String audioUrl = "http://192.168.3.150:816/mp3?s=" + broadcast; if (isUrlReachable(audioUrl, MainActivity3.this)) { // 开始播放音频 Log.e("Broadcast", "音频 URL :" + audioUrl); playAudioWithExoPlayer(audioUrl); } else { Log.e("Broadcast", "音频 URL 不可用"); } } SimpleExoPlayer player; private void playAudioWithExoPlayer(String audioUrl) { if (player != null) { player.release(); player = null; } TrackSelector trackSelector = new DefaultTrackSelector(); player = new SimpleExoPlayer.Builder(MainActivity3.this).setTrackSelector(trackSelector).build(); MediaItem mediaItem = MediaItem.fromUri(audioUrl); player.setMediaItem(mediaItem); player.prepare(); player.play(); } } @Override public void onBackPressed() { // 如果 WebView 可以返回,则返回上一页 if (webView.canGoBack()) { webView.goBack(); } else { super.onBackPressed(); } } private boolean isUrlReachable(String audioUrl, Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); if (netInfo == null || !netInfo.isConnected()) { Log.e("Network", "No network connection"); return false; } try { URL url = new URL(audioUrl); HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); urlConn.setConnectTimeout(3000); urlConn.setRequestMethod("HEAD"); int responseCode = urlConn.getResponseCode(); String contentType = urlConn.getContentType(); Log.d("URLCheck", "Response Code: " + responseCode); Log.d("URLCheck", "Content-Type: " + contentType); urlConn.disconnect(); return responseCode == HttpURLConnection.HTTP_OK; } catch (IOException e) { Log.e("URLCheck", "URL 不可达", e); return false; } } }package com.example; import android.content.Context; import androidx.annotation.NonNull; import androidx.work.Worker; import androidx.work.WorkerParameters; import com.example.layoutdome.StyleRequest; public class StyleWorker extends Worker { public StyleWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { super(context, workerParams); } @NonNull @Override public Result doWork() { // 执行你的请求逻辑,例如: new StyleRequest(getApplicationContext()).execute(); return Result.success(); } } package com.example.layoutdome; import android.os.AsyncTask; import android.util.Log; import com.google.gson.Gson; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.List; public class StyleRequest extends AsyncTask<Void, Void, String> { private static final String TAG = "DataUploader"; private static final int TIME_OUT = 10000; // 设置超时时间 private static final String CHARSET = "UTF-8"; // private static final String REQUEST_URL = "http://117.71.111.12:8087/api/open/saveFlowConsume"; private static final String REQUEST_URL = "http://192.168.2.81:8087/api/open/getStyle"; private OnStyleRequestListener listener; public StyleRequest(OnStyleRequestListener listener) { this.listener = listener; } @Override protected String doInBackground(Void... voids) { String result = null; HttpURLConnection conn = null; BufferedReader reader = null; try { // 将表单数据追加到 URL 后面,形成 GET 请求的查询参数 String urlString = REQUEST_URL; URL url = new URL(urlString); conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(TIME_OUT); conn.setConnectTimeout(TIME_OUT); conn.setRequestMethod("GET"); conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Charset", CHARSET); // 发送 GET 请求 int responseCode = conn.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } result = response.toString(); } else { Log.e(TAG, "Server returned non-OK status: " + responseCode); } } catch (IOException e) { Log.e(TAG, "IOException: " + e.getMessage()); } finally { try { if (reader != null) { reader.close(); } if (conn != null) { conn.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return result; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); // 处理上传结果 Log.d(TAG, "Data upload result: " + result); // 创建 Gson 对象 Gson gson = new Gson(); // 将 JSON 字符串解析为 DataList 对象 StyleList styleList = gson.fromJson(result, StyleList.class); if (styleList != null && styleList.getData() != null) { // 获取数据 StyleList.DataDTO dataDTO = styleList.getData(); System.out.println("Data Name: " + dataDTO.getName()); // 添加到 dataLists 列表 List<StyleList> styleLists = new ArrayList<>(); styleLists.add(styleList); // 输出验证 System.out.println("dataLists size: " + styleLists.size()); if (listener != null) { listener.onStyleRequest(styleList); // 调用回调接口,将数据传递给 MainActivity } }else { Log.e("Error", "dataList 或 dataDTO 为 null"); } } // 定义一个接口回调 public interface OnStyleRequestListener { void onStyleRequest(StyleList styleList); } } StyleWorker中new StyleRequest(getApplicationContext()).execute();这段代码报错
最新发布
07-27
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值