MUI安卓实现https 全部。从前端到后端

第一步生成服务端证书。配置服务端的https服务。这里,我们通过nginx 做。好处是不用配置修改服务器端代码。

    这里请看。https://blog.csdn.net/liuno0/article/details/108308254

    这时候,服务端配置好了。证书也有了。你想看https 通了没,可以看看,你服务端的测试接口。

第二步生成客户端证书。安卓使用的是BKS格式,但是我们只有P12格式。

    P12转BKS,这里可以看。https://blog.csdn.net/liuno0/article/details/108362318

    CER放到证书库里。这里可以看。https://blog.csdn.net/liuno0/article/details/109143196

    如果没有转换工具,给我留言。

第三部拿到生成的client.bks 和  client.truststore通过okhttp 就可以实现安卓的https 双向认证了。

安卓端,这里面是全部的代码。包括 同步 异步 get post  上传 下载。可以根据自己使用情况修改。

只有修改AjaxUtil这个工具类,
酌情修改HttpsUtil  
修改SSLHelper里面证书的信息。
如果,报错Context 这个问题。自己想办法。我用了一个取巧的方法。

import android.content.Context;

import java.util.ArrayList;
import java.util.List;

public class NetConfig {
    private static List CERTIFICATES_DATA = new ArrayList();

    public synchronized static void addContext(Context context) {

        if (context != null) {
            CERTIFICATES_DATA.add(0,context);
//            CERTIFICATES_DATA.add(context);
        }
    }

    public static Context getContextData() {
        return (Context)CERTIFICATES_DATA.get(0);
    }


}

 在MainActivity放进去。

NetConfig.addContext(this);
package com.ssl;

import io.dcloud.common.DHInterface.StandardFeature;

import android.os.Environment;
import android.os.Handler;
import android.os.RemoteException;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketTimeoutException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.util.JSUtil;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class AjaxUtil extends StandardFeature {
    String muiAppDoc= "apps/H5FA67A95";
    public JSONArray resultMsg;
    public JSONArray resultMsgSync;
    public IWebview webview;
    String callbackId;
    private int serversLoadTimes =0;
    private static final int maxLoadTimes =3; // 最大重连次数

    OkHttpClient okHttpClient=null ;


    String encrydataStr;
    String url;
    /**
     * 同步调用原生的方法
     * @param webview 调用这个原生方法的js所在的webview
     * @param json js调用时传入的参数列表
     * @return 返回给js的值
     * */
    public String functionSync(IWebview webview, JSONArray json) throws JSONException {
        resultMsgSync=new JSONArray();
        JSONArray paramJSONArray= json.getJSONArray(0);
        String url=paramJSONArray.optString(4).trim();
        String paramStr=paramJSONArray.optString(5).trim();
        String datatypeparam=paramJSONArray.optString(6).trim();
        String typeparam=paramJSONArray.optString(7).trim();
        if(datatypeparam.equals("json")&&typeparam.equals("post")){
            if(paramStr.equals(null)||paramStr.equals("")){
                postFunctionSyncNoparam(json);
            }else {
                postSyncRequest(json);
//                String valuess=(String) resultMsgSync.get(0);
//                //解密动作
//                String encrydataStr1=EncryptionUtil.decrypt(valuess);
//                resultMsgSync.put(0,encrydataStr1);

            }
        }else
        if(datatypeparam.equals("jsonNoJiaMi")&&typeparam.equals("post")){
            postSyncRequestNojiami(json);
        }

//        Log.e(TAG, String.format("webview = %s, jsonArray = %s", webview, json));
//        Log.e(TAG, String.format("thread name = %s, id = %s", Thread.currentThread().getName(), Thread.currentThread().getId()));
//        webview.evalJS("(function(){alert('webview.evalJS')})();");
        String values=null;
        for(int i=0;i<1000;i++){
//        while (true)   {
            if(resultMsgSync.length()>0){
                values=(String) resultMsgSync.get(0);
                break;
            }
        }
//        String values=(String) resultMsgSync.get(0);
        return JSUtil.wrapJsVar(values);
    }
    /**
     * 发送同步的post请求,不修改请求,请求不加密,返回不加密
     */
    public void postSyncRequestNojiami(JSONArray json) throws JSONException {

        JSONArray paramJSONArray= json.getJSONArray(0);
        url=paramJSONArray.optString(4).trim();
        String paramValues=paramJSONArray.getString(5);
        JSONObject  jsonObject=new  JSONObject(paramValues);
        MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        //创建一个RequestBody(参数1:数据类型 参数2传递的json串)
        RequestBody requestBody = RequestBody.create(JSON, String.valueOf(jsonObject));
        okHttpClient = new OkHttpClient().newBuilder()
                .sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
                .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
                .build();//创建OkHttpClient对象。
        Request request = new Request.Builder()//创建Request 对象。
                .url(url)
                .post(requestBody)//传递请求体
                .header("User-Agent", "OkHttp Headers.java")
                .addHeader("userId", UserConfig.getUserData())
                .build();

        try {
            Response response = okHttpClient.newCall(request).execute();
            String aaa=response.body().string();

            resultMsgSync.put(0,aaa);
        } catch (IOException e) {
            e.printStackTrace();
            JSONArray resultMsgErr=new JSONArray();
            JSONObject  jsonObjectE=new  JSONObject();
            try {
                jsonObjectE.put("resultCode","4044");
            } catch (JSONException e1) {
                e1.printStackTrace();
            }
            try {
                resultMsgErr.put(0,jsonObjectE);
            } catch (JSONException e1) {
                e1.printStackTrace();
            }
            resultMsgSync.put(0,"4044");



        }
    }

    /**
     * 发送同步的post请求
     */
    public void postSyncRequest(JSONArray json) throws JSONException {
        if(resultMsgSync.length()>0){
            resultMsgSync.remove(0);
        }
        JSONArray paramJSONArray= json.getJSONArray(0);
        url=paramJSONArray.optString(4).trim();

        String paramValues=paramJSONArray.getString(5);

        int index=url.indexOf("appSessionOut");
        String userId =null;
        if(index!=-1) {
            JSONObject  jsonObject3=new  JSONObject(paramValues);
            userId = jsonObject3.getString("userId");
            UserConfig.addUser(userId);
        }

        String enc3=EncryptionUtil.encrypt3(paramValues);
        String timestampStr= getPrecisionStandardTime();
        JSONObject  jsonObject2=new  JSONObject();
        jsonObject2.put("olddata",paramValues);
        jsonObject2.put("auth2",enc3);
        jsonObject2.put("timestamp",timestampStr);
        String jsonStr2=jsonObject2.toString();

        encrydataStr=EncryptionUtil.encrypt2(jsonStr2);
        okHttpClient = new OkHttpClient().newBuilder()
                .sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
                .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
                .build();//创建OkHttpClient对象。
        FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
        formBody.add("encrydata",encrydataStr);//传递键值对参数

        Request request = new Request.Builder()//创建Request 对象。
                .url(url)
                .post(formBody.build())//传递请求体
                .header("User-Agent", "OkHttp Headers.java")
                .addHeader("userId", UserConfig.getUserData())
                .build();

        try {
            Response response = okHttpClient.newCall(request).execute();
            String aaa=response.body().string();
            //解密动作
            resultMsgSync.put(0,EncryptionUtil.decrypt(aaa));
        } catch (IOException e) {
            e.printStackTrace();
            JSONArray resultMsgErr=new JSONArray();
            JSONObject  jsonObjectE=new  JSONObject();
            try {
                jsonObjectE.put("resultCode","4044");
            } catch (JSONException e1) {
                e1.printStackTrace();
            }
            try {
                resultMsgErr.put(0,jsonObjectE);
            } catch (JSONException e1) {
                e1.printStackTrace();
            }
            resultMsgSync.put(0,"4044");



        }

    }



    /**
     * post 不带参数,同步
     * @param json
     * @throws JSONException
     */
    private void postFunctionSyncNoparam(JSONArray json) throws JSONException {
        if(resultMsgSync.length()>0){
            resultMsgSync.remove(0);
        }

        JSONArray paramJSONArray= json.getJSONArray(0);
        String url=paramJSONArray.optString(4).trim();

        OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
                .sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
                .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
                .build();//创建OkHttpClient对象。

        FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
        Request request = new Request.Builder()//创建Request 对象。
                .url(url)
                .post(formBody.build())//传递请求体
                .header("User-Agent", "OkHttp Headers.java")
                .addHeader("userId", UserConfig.getUserData())
                .build();

        try {
            Response response = okHttpClient.newCall(request).execute();
            resultMsgSync.put(0,response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
            JSONArray resultMsgErr=new JSONArray();
            JSONObject  jsonObjectE=new  JSONObject();
            try {
                jsonObjectE.put("resultCode","4044");
            } catch (JSONException e1) {
                e1.printStackTrace();
            }
            try {
                resultMsgErr.put(0,jsonObjectE);
            } catch (JSONException e1) {
                e1.printStackTrace();
            }
            resultMsgSync.put(0,"4044");



        }

    }

    /**
     * 异步调用原生的方法
     * @param webview1 调用这个原生方法的js所在的webview
     * @param json js调用时传入的参数列表
     * */

    public void functionAsync(final IWebview webview1, JSONArray json){
        if(resultMsg==null){
            resultMsg=new JSONArray();
        }
        okHttpClient = new OkHttpClient().newBuilder()
                .sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
                .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
                .build();//创建OkHttpClient对象。
        webview=webview1;

        try {
            callbackId = json.optString(0);

            JSONArray paramJSONArray= json.getJSONArray(1);
            String datatypeparam=paramJSONArray.optString(6).trim();
            String typeparam=paramJSONArray.optString(7).trim();
            String paramStr=paramJSONArray.optString(5).trim();
            if(datatypeparam.equals("json")&&typeparam.equals("post")){
                if(paramStr.equals(null)||paramStr.equals("")){
                    postFunctionNoparam(json);
                }else {
                    postFunction(json);
                }
            }
            if(datatypeparam.equals("jsonnojiami")&&typeparam.equals("post")){
                postFunctionNojiami(json);
            }
            if(datatypeparam.equals("jsonreqjiami")&&typeparam.equals("post")){
                postFunctionReqjiami(json);
            }
            if(datatypeparam.equals("filedownload")&&typeparam.equals("get")){
                postFunctiondownFile(json);
            }
            if(datatypeparam.equals("fileup")&&typeparam.equals("post")){
                postFunctionupFile(json);
            }

        }catch (Exception e){
            e.printStackTrace();
        }
//        handler.postDelayed(new Runnable() {
//            @Override
//            public void run() {
//
//                if (resultMsg.length() == 0) {
//                    JSONArray jsonyMSG11=new JSONArray();
//                    jsonyMSG11.put("请求超时");
//                    JSUtil.execCallback(webview1, callbackId, jsonyMSG11, JSUtil.OK, false);
//                }
//            }
//        }, 6000);
    }

    /**
     * 调用okhttp,这里面有ssl
     * @param json
     */
    public void gettFunction(JSONArray json) throws JSONException {
        resultMsg.remove(0);

        JSONArray paramJSONArray= json.getJSONArray(1);
        String url=paramJSONArray.optString(4).trim();
        String paramValues=paramJSONArray.getString(5);
        //创建日志拦截器,用于日志打印
//        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
//        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
                .sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
                .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
                .build();

        Request request = new Request.Builder()
                .url(url)
                .get()
                .header("User-Agent", "OkHttp Headers.java")
                .addHeader("userId", UserConfig.getUserData())
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                JSONArray resultMsgErr=new JSONArray();
                JSONObject  jsonObjectE=new  JSONObject();
                try {
                    jsonObjectE.put("resultCode","4044");
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
                try {
                    resultMsgErr.put(0,jsonObjectE);
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
                JSUtil.excCallbackError(webview, callbackId, "网络异常,请检查网络!");
                // JSUtil.execCallback(webview, callbackId, resultMsgErr, JSUtil.OK, false);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                resultMsg.put(response.body().string());
                String b=response.message();
//                LogUtils.i("请求成功" + response.body().toString());
//                LogUtils.i("请求成功" + response.message());
                JSUtil.execCallback(webview, callbackId, resultMsg, JSUtil.OK, false);
            }
        });
    }


    /**
     * post 异步请求
     * @param json
     * @throws JSONException
     */
    private void postFunction(JSONArray json) throws JSONException {
        if(resultMsg.length()>0){
            resultMsg.remove(0);
        }

        JSONArray paramJSONArray= json.getJSONArray(1);
        String url=paramJSONArray.optString(4).trim();

        String paramValues=paramJSONArray.getString(5);

        int index=url.indexOf("appSessionOut");
        String userId =null;
        if(index!=-1) {
            JSONObject  jsonObject3=new  JSONObject(paramValues);
            userId = jsonObject3.getString("userId");
            UserConfig.addUser(userId);
        }

        String enc3=EncryptionUtil.encrypt3(paramValues);
        String timestampStr= getPrecisionStandardTime();
        JSONObject  jsonObject2=new  JSONObject();
        jsonObject2.put("olddata",paramValues);
        jsonObject2.put("auth2",enc3);
        jsonObject2.put("timestamp",timestampStr);
        String jsonStr2=jsonObject2.toString();

        String encrydataStr=EncryptionUtil.encrypt2(jsonStr2);

//        okHttpClient = new OkHttpClient().newBuilder()
//                .connectTimeout(50000, TimeUnit.MILLISECONDS)
//                .readTimeout(50000, TimeUnit.MILLISECONDS)
//                .sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
//                .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
//                .build();//创建OkHttpClient对象。
        FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
        formBody.add("encrydata",encrydataStr);//传递键值对参数

        Request request = new Request.Builder()//创建Request 对象。
                .url(url)
                .post(formBody.build())//传递请求体
                .header("User-Agent", "OkHttp Headers.java")
                .addHeader("userId", UserConfig.getUserData())
                .build();

        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
//                LogUtils.i("请求失败:"+e.getMessage());

                e.printStackTrace();
                JSONArray resultMsgErr=new JSONArray();
                JSONObject  jsonObjectE=new  JSONObject();
                try {
                    jsonObjectE.put("resultCode","4044");
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
                try {
                    resultMsgErr.put(0,jsonObjectE);
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
                JSUtil.excCallbackError(webview, callbackId, "网络异常,请检查网络!");
               // JSUtil.execCallback(webview, callbackId, resultMsgErr, JSUtil.OK, false);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //解密动作
                String encrydataStr1=EncryptionUtil.decrypt(response.body().string());
                try {
                    resultMsg.put(0,encrydataStr1);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
//                resultMsg.put(encrydataStr1);
                String b=response.message();
//                LogUtils.i("请求成功" + response.body().toString());
//                LogUtils.i("请求成功" + response.message());
                JSUtil.execCallback(webview, callbackId, resultMsg, JSUtil.OK, false);
            }
        });
    }
    /**
     * post 异步请求 不加密,
     * @param json
     * @throws JSONException
     */
    private void postFunctionNojiami(JSONArray json) throws JSONException {
        if(resultMsg.length()>0){
            resultMsg.remove(0);
        }
        JSONArray paramJSONArray= json.getJSONArray(1);
        String url=paramJSONArray.optString(4).trim();

        String paramValues=paramJSONArray.getString(5);

        //String转JSONObject
        JSONObject result = new JSONObject(paramValues);
        //取数据
        String olddata= (String) result.get("olddata");
        //取数据
        String auth2= (String) result.get("auth2");
//        OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
//                .connectTimeout(50000, TimeUnit.MILLISECONDS)
//                .readTimeout(50000, TimeUnit.MILLISECONDS)
//                .sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
//                .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
//                .build();//创建OkHttpClient对象。
        FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
        formBody.add("olddata",olddata);//传递键值对参数
        formBody.add("auth2",auth2);//传递键值对参数
        Request request = new Request.Builder()//创建Request 对象。
                .url(url)
                .post(formBody.build())//传递请求体
                .header("User-Agent", "OkHttp Headers.java")
                .addHeader("userId", UserConfig.getUserData())
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
//                LogUtils.i("请求失败:"+e.getMessage());
                e.printStackTrace();
                JSONArray resultMsgErr=new JSONArray();
                JSONObject  jsonObjectE=new  JSONObject();
                try {
                    jsonObjectE.put("resultCode","4044");
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
                try {
                    resultMsgErr.put(0,jsonObjectE);
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }

                JSUtil.excCallbackError(webview, callbackId, "网络异常,请检查网络!");
                // JSUtil.execCallback(webview, callbackId, resultMsgErr, JSUtil.OK, false);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
//                resultMsg.put(response.body().string());
                try {
                    resultMsg.put(0,response.body().string());
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                String b=response.message();

                JSUtil.execCallback(webview, callbackId, resultMsg, JSUtil.OK, false);
            }
        });
    }

    /**
     * post 异步请求 请求加密,请求的数据在前段已经加好密了
     * @param json
     * @throws JSONException
     */
    private void postFunctionReqjiami(JSONArray json) throws JSONException {
        if(resultMsg.length()>0){
            resultMsg.remove(0);
        }

        JSONArray paramJSONArray= json.getJSONArray(1);
        String url=paramJSONArray.optString(4).trim();

        String paramValues=paramJSONArray.getString(5);

        //String转JSONObject
        JSONObject result = new JSONObject(paramValues);
        //取数据
        String encryptedReq= (String) result.get("encryptedReq");
//        okHttpClient = new OkHttpClient().newBuilder()
//                .connectTimeout(50000, TimeUnit.MILLISECONDS)
//                .readTimeout(50000, TimeUnit.MILLISECONDS)
//                .sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
//                .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
//                .build();//创建OkHttpClient对象。
        FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
        formBody.add("encryptedReq",encryptedReq);//传递键值对参数
        Request request = new Request.Builder()//创建Request 对象。
                .url(url)
                .post(formBody.build())//传递请求体
                .header("User-Agent", "OkHttp Headers.java")
                .addHeader("userId", UserConfig.getUserData())
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                JSONArray resultMsgErr=new JSONArray();
                JSONObject  jsonObjectE=new  JSONObject();
                try {
                    jsonObjectE.put("resultCode","4044");
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
                try {
                    resultMsgErr.put(0,jsonObjectE);
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
                JSUtil.excCallbackError(webview, callbackId, "网络异常,请检查网络!");
                // JSUtil.execCallback(webview, callbackId, resultMsgErr, JSUtil.OK, false);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                try {
                    resultMsg.put(0,response.body().string());
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                String b=response.message();

                JSUtil.execCallback(webview, callbackId, resultMsg, JSUtil.OK, false);
            }
        });
    }
    /**
     * post 不带参数,
     * @param json
     * @throws JSONException
     */
    private void postFunctionNoparam(JSONArray json) throws JSONException {
        if(resultMsg.length()>0){
            resultMsg.remove(0);
        }

        JSONArray paramJSONArray= json.getJSONArray(1);
        String url=paramJSONArray.optString(4).trim();
//
//        OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
//                .connectTimeout(50000, TimeUnit.MILLISECONDS)
//                .readTimeout(50000, TimeUnit.MILLISECONDS)
//                .sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
//                .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
//                .build();//创建OkHttpClient对象。
        FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
        Request request = new Request.Builder()//创建Request 对象。
                .url(url)
                .post(formBody.build())//传递请求体
                .header("User-Agent", "OkHttp Headers.java")
                .addHeader("userId", UserConfig.getUserData())
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                JSONArray resultMsgErr=new JSONArray();
                JSONObject  jsonObjectE=new  JSONObject();
                try {
                    jsonObjectE.put("resultCode","4044");
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
                try {
                    resultMsgErr.put(0,jsonObjectE);
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
                JSUtil.excCallbackError(webview, callbackId, "网络异常,请检查网络!");
                // JSUtil.execCallback(webview, callbackId, resultMsgErr, JSUtil.OK, false);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                try {
                    resultMsg.put(0,response.body().string());
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                String b=response.message();

                JSUtil.execCallback(webview, callbackId, resultMsg, JSUtil.OK, false);
            }
        });
    }

    /**
     * post 下载文件,
     * @param json
     * @throws JSONException
     */
    private void postFunctiondownFile(JSONArray json) throws JSONException {
        if(resultMsg.length()>0){
            resultMsg.remove(0);
        }

        JSONArray paramJSONArray= json.getJSONArray(1);
        String url=paramJSONArray.optString(4).trim();
        String fileUrlOld=paramJSONArray.getString(5);
        final String fileUrl=fileUrlOld.substring(1);
//        OkHttpClient okHttpClientdown = new OkHttpClient().newBuilder()
//                .connectTimeout(120000, TimeUnit.MILLISECONDS)
//                .readTimeout(120000, TimeUnit.MILLISECONDS)
//                .sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
//                .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
//                .build();//创建OkHttpClient对象。
        Request request = new Request.Builder()//创建Request 对象。
                .url(url)
                .get()
                .header("User-Agent", "OkHttp Headers.java")
                .addHeader("userId", UserConfig.getUserData())
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                JSONArray resultMsgErr=new JSONArray();
                JSONObject  jsonObjectE=new  JSONObject();
                try {
                    jsonObjectE.put("resultCode","4044");
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
                try {
                    resultMsgErr.put(0,jsonObjectE);
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
                JSUtil.excCallbackError(webview, callbackId, "网络异常,请检查网络!");
                // JSUtil.execCallback(webview, callbackId, resultMsgErr, JSUtil.ERROR, false);
            }

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


                InputStream is = response.body().byteStream();//从服务器得到输入流对象
                String[] fileArray=fileUrl.split("/");
                //获取程序的cache路径
                File gcjslrcache= NetConfig.getContextData().getExternalCacheDir();
                String gcjslrcacheUrl= gcjslrcache.getPath();
                //截取字符串去掉cache
                String gcjslrUrl=gcjslrcacheUrl.substring(0,gcjslrcacheUrl.length()-6);
                //拼接成doc的路径
                File newFile = new File(gcjslrUrl+File.separator+muiAppDoc+File.separator+fileArray[0]);

                if(!newFile.exists()){
                    newFile.mkdirs();
                }
                File newFile1 = new File(newFile,fileArray[1]);

                FileOutputStream  fos = new FileOutputStream(newFile1);
                byte[] buf = new byte[1024*8];
                int len = 0;
                while ((len = is.read(buf)) != -1){
                    fos.write(buf, 0, len);
                }
                fos.flush();

                JSONObject  jsonObjectr=new  JSONObject();
                try {
                    jsonObjectr.put("resultCode",response.code());
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                String jsonStrr=jsonObjectr.toString();
                try {
                    resultMsg.put(0,jsonStrr);
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                JSUtil.execCallback(webview, callbackId, resultMsg, JSUtil.OK, false);
            }
        });
    }

    /**
     * post 上传文件
     * @param json
     * @throws JSONException
     */
    private void postFunctionupFile(JSONArray json) throws JSONException, IOException {
        if(resultMsg.length()>0){
            resultMsg.remove(0);
        }

        JSONArray paramJSONArray= json.getJSONArray(1);
        String url=paramJSONArray.optString(4).trim();
        String fileUrlOld=paramJSONArray.getString(5);
        String fileUrl=fileUrlOld.substring(1);

        String[] fileArray=fileUrl.split("/");
        //获取程序的cache路径
        File gcjslrcache= NetConfig.getContextData().getExternalCacheDir();
        String gcjslrcacheUrl= gcjslrcache.getPath();
        //截取字符串去掉cache
        String gcjslrUrl=gcjslrcacheUrl.substring(0,gcjslrcacheUrl.length()-6);
        //拼接成doc的路径
        File newFile = new File(gcjslrUrl+File.separator+muiAppDoc+File.separator+fileArray[0]);
        //文件的路径
        File newFile1 = new File(newFile,fileArray[1]);

        okHttpClient = new OkHttpClient().newBuilder()
                .sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
                .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
                .build();//创建OkHttpClient对象。
        RequestBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("sjjl", newFile1.getName(),
                        RequestBody.create(MediaType.parse("multipart/form-data"), newFile1))
                .build();

        FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
        Request request = new Request.Builder()//创建Request 对象。
                .url(url)
                .post(requestBody)
                .header("User-Agent", "OkHttp Headers.java")
                .addHeader("userId", UserConfig.getUserData())
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                JSONArray resultMsgErr=new JSONArray();
                JSONObject  jsonObjectE=new  JSONObject();
                try {
                    jsonObjectE.put("resultCode","4044");
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
                try {
                    resultMsgErr.put(0,jsonObjectE);
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
                JSUtil.excCallbackError(webview, callbackId, "网络异常,请检查网络!");
                // JSUtil.execCallback(webview, callbackId, resultMsgErr, JSUtil.OK, false);
            }

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

                JSONObject  jsonObjectr=new  JSONObject();
                try {
                    jsonObjectr.put("resultCode",response.code());
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                String jsonStrr=jsonObjectr.toString();
                try {
                    resultMsg.put(0,jsonStrr);
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                JSUtil.execCallback(webview, callbackId, resultMsg, JSUtil.OK, false);
            }
        });
    }
    /**
     * 格式化时间,精确到毫秒
     *
     */
    public String getPrecisionStandardTime(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
        Date date =  new Date(System.currentTimeMillis());
        String time = sdf.format(date);
        return time;

    }

}
package com.ssl;

import android.content.Context;

import java.io.IOException;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

public class SSLHelper {
    private static final String TAG = "SSLHelper";
    private final static String CLIENT_PRI_KEY = "client.bks";
//    private final static String TRUSTSTORE_PUB_KEY = "root.bks";
    private final static String TRUSTSTORE_PUB_KEY = "client.truststore";

    private final static String CLIENT_BKS_PASSWORD = "123456";
    private final static String TRUSTSTORE_BKS_PASSWORD = "123456";
    private final static String KEYSTORE_TYPE = "BKS";
    private final static String PROTOCOL_TYPE = "TLS";
    private final static String CERTIFICATE_STANDARD = "X509";

    public static SSLSocketFactory getSSLCertifcation(Context context) {
        SSLSocketFactory sslSocketFactory = null;
        try {
            // 服务器端需要验证的客户端证书,其实就是客户端的keystore
            KeyStore keyStore = KeyStore.getInstance(KEYSTORE_TYPE);
            // 客户端信任的服务器端证书
            KeyStore trustStore = KeyStore.getInstance(KEYSTORE_TYPE);

            //读取证书
            InputStream ksIn = context.getAssets().open(CLIENT_PRI_KEY);
            InputStream tsIn = context.getAssets().open(TRUSTSTORE_PUB_KEY);

            //加载证书
            keyStore.load(ksIn, CLIENT_BKS_PASSWORD.toCharArray());
            trustStore.load(tsIn, TRUSTSTORE_BKS_PASSWORD.toCharArray());
            ksIn.close();
            tsIn.close();


            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(CERTIFICATE_STANDARD);
            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(CERTIFICATE_STANDARD);
            trustManagerFactory.init(trustStore);
            keyManagerFactory.init(keyStore, CLIENT_BKS_PASSWORD.toCharArray());

            //初始化SSLContext
            SSLContext sslContext = SSLContext.getInstance(PROTOCOL_TYPE);
            sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new java.security.SecureRandom());

            sslSocketFactory = sslContext.getSocketFactory();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (CertificateException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnrecoverableKeyException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        }
        return sslSocketFactory;
    }


}
package com.ssl;

import java.io.IOException;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

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

public class HttpsUtil {
    public static class SSLParams
    {
        public SSLSocketFactory sSLSocketFactory;
        public X509TrustManager trustManager;
    }

    public static SSLParams getSslSocketFactory(InputStream[] certificates, InputStream bksFile, String password)
    {
        SSLParams sslParams = new SSLParams();
        try
        {
            TrustManager[] trustManagers = prepareTrustManager(certificates);
            KeyManager[] keyManagers = prepareKeyManager(bksFile, password);
            SSLContext sslContext = SSLContext.getInstance("TLS");
            X509TrustManager trustManager = null;
            if (trustManagers != null)
            {
                trustManager = new MyTrustManager(chooseTrustManager(trustManagers));
            } else
            {
                trustManager = new UnSafeTrustManager();
            }
            sslContext.init(keyManagers, new TrustManager[]{trustManager},null);
            sslParams.sSLSocketFactory = sslContext.getSocketFactory();
            sslParams.trustManager = trustManager;
            return sslParams;
        } catch (NoSuchAlgorithmException e)
        {
            throw new AssertionError(e);
        } catch (KeyManagementException e)
        {
            throw new AssertionError(e);
        } catch (KeyStoreException e)
        {
            throw new AssertionError(e);
        }
    }

    public static class  UnSafeHostnameVerifier implements HostnameVerifier
    {
        @Override
        public boolean verify(String hostname, SSLSession session)
        {
            return true;
        }
    }

    public static class UnSafeTrustManager 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[]{};
        }
    }

    private static TrustManager[] prepareTrustManager(InputStream... certificates)
    {
        if (certificates == null || certificates.length <= 0) return null;
        try
        {

            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(null);
            int index = 0;
            for (InputStream certificate : certificates)
            {
                String certificateAlias = Integer.toString(index++);
                keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
                try
                {
                    if (certificate != null)
                        certificate.close();
                } catch (IOException e)

                {
                }
            }
            TrustManagerFactory trustManagerFactory = null;

            trustManagerFactory = TrustManagerFactory.
                    getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init(keyStore);

            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();

            return trustManagers;
        } catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        } catch (CertificateException e)
        {
            e.printStackTrace();
        } catch (KeyStoreException e)
        {
            e.printStackTrace();
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;

    }

    private static KeyManager[] prepareKeyManager(InputStream bksFile, String password)
    {
        try
        {
            if (bksFile == null || password == null) return null;

            KeyStore clientKeyStore = KeyStore.getInstance("BKS");
            clientKeyStore.load(bksFile, password.toCharArray());
            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            keyManagerFactory.init(clientKeyStore, password.toCharArray());
            return keyManagerFactory.getKeyManagers();

        } catch (KeyStoreException e)
        {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        } catch (UnrecoverableKeyException e)
        {
            e.printStackTrace();
        } catch (CertificateException e)
        {
            e.printStackTrace();
        } catch (IOException e)
        {
            e.printStackTrace();
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

    private static X509TrustManager chooseTrustManager(TrustManager[] trustManagers)
    {
        for (TrustManager trustManager : trustManagers)
        {
            if (trustManager instanceof X509TrustManager)
            {
                return (X509TrustManager) trustManager;
            }
        }
        return null;
    }


    private static class MyTrustManager implements X509TrustManager
    {
        private X509TrustManager defaultTrustManager;
        private X509TrustManager localTrustManager;

        public MyTrustManager(X509TrustManager localTrustManager) throws NoSuchAlgorithmException, KeyStoreException
        {
            TrustManagerFactory var4 = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            var4.init((KeyStore) null);
            defaultTrustManager = chooseTrustManager(var4.getTrustManagers());
            this.localTrustManager = localTrustManager;
        }


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

        }

        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException
        {
            try
            {
                defaultTrustManager.checkServerTrusted(chain, authType);
            } catch (CertificateException ce)
            {
                localTrustManager.checkServerTrusted(chain, authType);
            }
        }


        @Override
        public X509Certificate[] getAcceptedIssuers()
        {
            return new X509Certificate[0];
        }
    }


}

这时候就可以https 通信了。

在安卓里添加。

这里我原来是ajax请求,后来改成了okhttp。在manifest.json添加。

写了一个ajaxutil.js 

document.addEventListener( "plusready",  function()
{
// 声明的JS“扩展插件别名”
    var _BARCODE = 'ajaxutil',
        B = window.plus.bridge;
var ajaxutil =
{
		//同步方法
         functionSync:function(Argus){
                             return B.execSync(_BARCODE, "functionSync", [Argus]);
          },
		  //异步方法
          functionAsync : function(Argus,successCallback, errorCallback )
                         {
                                var success = typeof successCallback !== 'function' ? null : function(args)
                                {			

                                successCallback(args);
                                },
                                fail = typeof errorCallback !== 'function' ? null : function(code)
                                {
                                errorCallback(code);
                                };
                                callbackID = B.callbackId(success, fail);
                                return B.exec(_BARCODE, "functionAsync", [callbackID, Argus]);

                     }

      };

    window.plus.ajaxutil = ajaxutil;
}, true );

异步的调用,模仿ajax。

	var urlm=serverAddress+"/IndexController/gettsrecord/"+pageNum+"/"+pageSize+"/"+total;
	var datam=JSON.stringify(searchJson);
	var typem="post";
	var dataTypem="json";

	plus.ajaxutil.functionAsync(["Html5", "Plus", "SyncFunction", "ArrayArgument!",urlm,datam,dataTypem,typem],
		function(result) {		
		var  data=JSON.parse(result);

			setValues('install-debug-list-online', data.data);
		},
		function(result) { 

			alert("网络异常!");

		});

 同步的调用

	var urlm=serverAddress + "/IndexController/getDataCounts";
	var dataaaa = {
		userid: userId,
		counttype: "azts",
		condition: jsonstr
	};
	var datam=JSON.stringify(dataaaa);
	var typem="post";
	var dataTypem="json";
	
	var result= plus.ajaxutil.functionSync(["Html5", "Plus", "SyncFunction", "ArrayArgument!",urlm,datam,dataTypem,typem]);	
	if(result=="4044"){
		setCounts("online");
		alert("网络异常,请检查网络!");		
		return;
	}
	var  data=JSON.parse(result);

				setCounts("online", data.data);

这时候,由原来的ajax 的http请求全部修改成安卓的okhttp 的https请求。

这篇比较长。慢慢来。不懂可以留言。

猜你喜欢

转载自blog.csdn.net/liuno0/article/details/111405324