问题描述
在使用 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 这种安全加密的协议。
请勿发布违反中国大陆地区法律的言论,请勿人身攻击、谩骂、侮辱和煽动式的语言。