判断当前系统是否挂代理
获取当前系统是否设置代理, 可以根据不同的 API Level, 分别通过 System.getProperty() 和 Android.NET.proxy.getXxx() 方法获取到.
- private fun checkWifiProxy(): Boolean {
- val IS_ICS_OR_LATER = Build.VERSION.SDK_INT>= Build.VERSION_CODES.ICE_CREAM_SANDWICH
- val proxyAddress: String?
- val proxyPort: Int?
- if (IS_ICS_OR_LATER) {
- proxyAddress = System.getProperty("http.proxyHost")
- val portStr = System.getProperty("http.proxyPort")
- proxyPort = Integer.parseInt(portStr ?: "-1")
- } else {
- proxyAddress = Android.NET.Proxy.getHost(this)
- proxyPort = Android.NET.Proxy.getPort(this)
- }
- Log.i("cxmyDev","proxyAddress : ${proxyAddress}, prot : ${proxyPort}")
- return !TextUtils.isEmpty(proxyAddress) && proxyPort != -1
- }
通过 Log, 就可以看到当前设备, 在 Wi-Fi 中, 挂的代理的 IP 和 Port 了.
拒绝发请求的缺点
若判断当前环境, 被挂了代理就拒绝请求, 其实是一个非常不友好的操作.
首先你需要有效的提醒用户, 去正确的设置 Wi-Fi 的代理; 其次, 总有一些特殊的情况, 用户需要在手机上挂代理, 可能不是针对你的 App, 总不能让你的 App 和当前代理在用户眼里 "不兼容" 吧!
设置不使用代理
Fiddler 和 Charles 这类抓包工具, 本质上就是利用中间人攻击的方式, 通过这个中间人获取到通信的数据.
而利用这些工具抓包的前提, 都是在设备上, 设置代理, 通常我们直接在 Wi-Fi 连接页面, 设置代理即可.
而对于一些常用的网络库, 其实是提供了我们设置的代理的接口, 我们只需要将其设置成无代理的模式, 它就不会去应用系统默认的代理了.
就拿比较常用的 OkHttp 来举例, 在初始化的时候, 就可以通过 proxy() 方法, 为 OkHttp 设置一个代理.
- var httpBuilder = OkHttpClient.Builder()
- .addInterceptor(defaultInterceptor())
- .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS)
- .writeTimeout(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS)
- .readTimeout(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS)
- .proxy(Proxy.NO_PROXY)
例如这里, 我们对其设置为不使用代理的模式, 它就不会从系统中, 读取代理信息, 进行网络请求. 而是会忽略掉它, 直接发送网络请求. 以这样的方式, 就可以阻止第三方使用 Fiddler 或 Charles 进行抓包.
对于防止抓包, 你还有什么新奇的思路, 不妨在留言区讨论~
最后
如果你看到了这里, 觉得文章写得不错就给个赞呗? 如果你觉得那里值得改进的, 请给我留言. 一定会认真查询, 修正不足. 谢谢.
来源: http://www.jianshu.com/p/ef50c943e81d