okhttp网络框架的https协议之忽略证书验证的登录实例

这是一个小小的登录案例是基于https的小demo,希望可以对各位同胞有所帮助!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

下面上代码

首先是一个工具类多一些功能进行了封装

public class HttpUtils {

    OkHttpClient client = getUnsafeOkHttpClient();
    public static final MediaType JSON
            = MediaType.parse("application/json; charset=utf-8");

    public String login(String url, String json) throws IOException {
        //把请求的内容字符串转换为json
        RequestBody body = RequestBody.create(JSON, json);
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();

        Response response = client.newCall(request).execute();

        String result = response.body().string();


        return result;


    }


    public String bolwingJson(String username, String password) {
        return "{'username':" + username + "," + "'password':" + password + "}";
       
    }

    public static OkHttpClient getUnsafeOkHttpClient() {

        try {
           
            final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] chain, String authType) {
                }

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

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

            }};

            
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts,
                    new java.security.SecureRandom());
           
           
            OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .sslSocketFactory(sslContext.getSocketFactory())
                    .hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            }
) .build(); return okHttpClient; } catch (Exception e) { throw new RuntimeException(e); } }}

主代码如下

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private static final String TAG ="MainActivity" ;
    //用户名
    private EditText mEtUsername;
    //密码
    private EditText mEtPwd;
    //登录按键
    private Button mBtnLogin;


    private String url ="https://i171635h39.51mypc.cn:35689/jeesite/a/login";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        initListener();
    }

    /**
     * 初始化组件
     */
    private void initView() {

        mEtUsername = (EditText) findViewById(R.id.login_edit_account);
        mEtPwd = (EditText) findViewById(R.id.login_edit_pwd);

        mBtnLogin = (Button) findViewById(R.id.login_btn_login);


    }

    /**
     * 设置监听器
     */
    private void initListener() {

        mBtnLogin.setOnClickListener(this);


    }

    /*
    单击事件监听
     */
    @Override
    public void onClick(View v) {
        if(v==mBtnLogin){
            login();
        }
    }

    /*
    登录
     */
    private void login() {

        final String username = mEtUsername.getText().toString().trim();
        final String password = mEtPwd.getText().toString().trim();


        if(TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){

            Toast.makeText(MainActivity.this, "用户名或者密码不能为空", Toast.LENGTH_SHORT).show();
            return;
        }

        new Thread(){
            @Override
            public void run() {

                HttpUtils httpUtils = new HttpUtils();
                //转换为JSON
                String user = httpUtils.bolwingJson(username, password);



                //String user ="{'username':" + username + ","+"'password':"+password+"}";

                Log.d(TAG, "user:" + user);

                try {
                    final String result = httpUtils.login(url, user);

                    Log.d(TAG, "结果:" + result);
                    //更新UI,在UI线程中
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if("SUCCESS".equals(result)){

                                Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();

                            }else{
                                Toast.makeText(MainActivity.this, "登录失败", Toast.LENGTH_SHORT).show();
                            }
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }




            }
        }.start();


    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用OkHttp时,如果我们想要忽略HTTPS证书校验,可以通过自定义一个用于信任所有证书的信任管理器来实现。 首先,我们需要创建一个TrustManager的实现类,该类用于信任所有的证书。可以通过重写checkClientTrusted和checkServerTrusted方法来实现,这两个方法在验证客户端和服务器端证书时被调用,我们可以在这里不进行任何校验直接返回一个空的链表。 接下来,我们需要创建一个SSLContext对象,并使用我们自定义的TrustManager进行初始化。然后,使用这个SSLContext对象创建一个SSLSocketFactory对象。 最后,我们将这个SSLSocketFactory对象设置到OkHttpClient中的SSL socket factory中,这样OkHttp在发起HTTPS请求时就会忽略证书校验了。 下面是一个示例代码: ```java // 创建信任所有证书的TrustManager X509TrustManager trustManager = new 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]; } }; try { // 创建一个SSLContext并使用我们的TrustManager初始化 SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, new TrustManager[]{trustManager}, null); // 创建SSLSocketFactory SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(sslSocketFactory, trustManager) .build(); // 使用client发起HTTPS请求 // ... } catch (Exception e) { e.printStackTrace(); } ``` 需要注意的是,忽略HTTPS证书校验存在一定的安全风险,因此建议仅在开发环境中使用,并在正式环境中使用正规的证书进行校验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值