基於OkHttp的一種防抓包方案
最近在讀OkHttp3.9.0
的原始碼,在瞭解了其代理機制之後發現了一種繞過代理,避免被抓包的方法。
在介紹這種防抓包方法之前,需要先了解一下OkHttp
中socket
連線建立的過程。
由於這個過程比較複雜,我簡述一下,在建立socket
連線之前,OkHttp
會獲取系統的代理資訊,如果設定代理,那麼通過DNS
解析其IP
然後使用代理IP
來建立socket
連線。如果沒有設定代理,那麼會使用請求中的url的IP
地址,來建立連線。
如果要防抓包,那隻需要繞過代理就可以了。
OkHttp
使用ProxySelector
來獲取代理資訊,在構造OkHttpClient
時是可以設定的,其預設值是ProxySelector.getDefault()
,該預設值會反應出系統的代理資訊。
那麼我們就可以提供自己的ProxySelector
實現來達到繞過系統代理的能力。程式碼如下:
OkHttpClient client = new OkHttpClient.Builder()
.proxySelector(new ProxySelector() {
@Override
public List<Proxy> select(URI uri) {
return Collections.singletonList(Proxy.NO_PROXY);
}
@Override
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
}
}).build();
複製程式碼