问题描述

在使用 OkHttp 的封装工具类 OkHttpUtils 向 Tomcat 发送请求的时候,出现了一个错误。错误描述如下。

CLEARTEXT communication not supported: [ConnectionSpec(cipherSuites=[TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, ......]

造成的原因是因为从 Android P(9.x)之后的版本不能够再进行明文的传输数据。http 就是一种明文传输的协议,需要对请求进行加密,比如使用 https 这种协议。说白了为了安全起见

而我在发送请求的时候正好也是明文传输的。

解决办法

修改项目的配置

新建一个 xml 文件,在 resources 文件夹下新建一个名字为 xml 的文件夹 ,新建一个文件名为 network_security_config.xml 内容如下。

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

然后再 AndroidManifest.xml 文件中,在 application 标签对中添加 android:networkSecurityConfig 和 android:usesCleartextTraffic ,参照下面的方式进行配置。

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:networkSecurityConfig="@xml/network_security_config"
        android:usesCleartextTraffic="true"
        android:supportsRtl="true"
        android:theme="@style/Theme.CarRent">
    <!-- 省略的内容 -->
</application>

最后重新编译(Build)一下这个项目,就可以了。

设置安全链接

也就是将 Tomcat 设置成 https 的协议。这个要是在本地开发的话我觉得倒是没必要,甚至为了一个 https 去弄还麻烦很多。

如果是 Tomcat 需要部署到生产环境,则为了数据传输安全,请使用 https 这种安全加密的协议。