現象:charles抓不到包,但wireshark,HttpAnalyzor可以抓到包。
關鍵代碼:
- URL url = new URL(urlStr);
- urlConnection = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);
- OkHttpClient client = new OkHttpClient().newBuilder().proxy(Proxy.NO_PROXY).build();
Android 如果防止APK被抓包工具抓包
轉:http://blog.csdn.net/a6136581/article/details/72627026
平時都是用Fiddler對Android應用進行抓包,如果對Fiddler不熟悉,可以點擊查看Fiddler抓包方法。在抓抱前,需要將手機的WiFi進行代理設置,然后才能在電腦上使用Fiddler成功抓包,那么我們試想一下,如果在APP請求網絡之前先判斷下手機網絡是否使用了代理,如果使用了代理就不請求接口。新的問題來了,在Android手機中如何知道手機網絡是否使用了代理?
代碼實踐
經過查找資料與實踐,發現如下的代碼能夠滿足需求:
- private boolean isWifiProxy() {
- final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
- String proxyAddress;
- int proxyPort;
- if (IS_ICS_OR_LATER) {
- proxyAddress = System.getProperty("http.proxyHost");
- String portStr = System.getProperty("http.proxyPort");
- proxyPort = Integer.parseInt((portStr != null ? portStr : "-1"));
- } else {
- proxyAddress = android.net.Proxy.getHost(this);
- proxyPort = android.net.Proxy.getPort(this);
- }
- return (!TextUtils.isEmpty(proxyAddress)) && (proxyPort != -1);
- }
JAVA基礎知識之網絡編程——-使用Proxy創建連接
轉:https://www.cnblogs.com/fysola/p/6089416.html
在前面的HTTP網絡通信的例子中,使用了URLConnection conn = url.openConnection();連接網絡,
如果改用URLConnection conn = url.openConnection(proxy);方式,傳入一個proxy對象,設置好代理IP和端口,則可以實現代理連接,
下面是一個簡單例子,
- package proxy;
- import java.io.IOException;
- import java.io.PrintStream;
- import java.net.InetSocketAddress;
- import java.net.MalformedURLException;
- import java.net.Proxy;
- import java.net.URL;
- import java.net.URLConnection;
- import java.util.Scanner;
- public class ProxyTest {
- final String PROXY_ADDR = "172.20.230.5";
- final int PROXY_PORT = 3128;
- String urlStr = "http://www.baidu.com";
- //String urlStr = "http://www.crazyit.org";
- public void init() throws IOException {
- URL url = new URL(urlStr);
- Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_ADDR, PROXY_PORT));
- //使用代理服務器打開鏈接
- URLConnection conn = url.openConnection(proxy);
- //URLConnection conn = url.openConnection();
- conn.setConnectTimeout(5000);
- try {
- Scanner scan = new Scanner(conn.getInputStream());
- PrintStream ps = new PrintStream("index.html");
- while (scan.hasNextLine()) {
- String line = scan.nextLine();
- System.out.println(line);
- ps.println(line);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) throws IOException {
- new ProxyTest().init();
- }
- }
實現自動代理
在上面的例子中,每次用url對象open一個connection的時候,都需要顯示地傳入一個proxy對象才行。
而實際上可以在connection之前,做一個默認代理設置,這樣以后再openConnection的時候,就不需要顯示傳入proxy對象了。
做默認代理設置需要重寫ProxySelector的select方法,返回代理IP和端口列表,具體實現如下,
- package proxy;
- import java.io.IOException;
- import java.io.PrintStream;
- import java.net.InetSocketAddress;
- import java.net.MalformedURLException;
- import java.net.Proxy;
- import java.net.ProxySelector;
- import java.net.SocketAddress;
- import java.net.URI;
- import java.net.URL;
- import java.net.URLConnection;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Scanner;
- public class ProxyTest {
- final String PROXY_ADDR = "172.20.230.5";
- final int PROXY_PORT = 3128;
- String urlStr = "http://www.baidu.com";
- //String urlStr = "http://www.crazyit.org";
- public void init() throws IOException {
- ProxySelector.setDefault(new ProxySelector(){
- @Override
- public void connectFailed(URI arg0, SocketAddress arg1,
- IOException arg2) {
- System.out.println("無法連接到服務器");
- }
- @Override
- public List<Proxy> select(URI uri) {
- List<Proxy> result = new ArrayList<>();
- result.add(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_ADDR, PROXY_PORT)));
- return result;
- }
- });
- URL url = new URL(urlStr);
- //使用代理服務器打開鏈接
- URLConnection conn = url.openConnection();
- conn.setConnectTimeout(5000);
- try {
- Scanner scan = new Scanner(conn.getInputStream());
- PrintStream ps = new PrintStream("index.html");
- while (scan.hasNextLine()) {
- String line = scan.nextLine();
- System.out.println(line);
- ps.println(line);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) throws IOException {
- new ProxyTest().init();
- }
- }
可以看到使用代理之后,再用url打開鏈接時就能像普通連接那樣url.openConnection();了
Android 開發之避免被第三方使用代理抓包
轉:http://blog.csdn.net/a807891033/article/details/53643550
最近遇到一個問題,手機wifi設置了一個可用代理后,然后再到自己的應用中耍,發現了一個大悲劇,
就是所有接口都訪問不了,全部進了異常中,瞬間就兩眼淚汪汪了,后來問了度娘,給出的一個還能用的
解釋:
- System.getProperties().remove("http.proxyHost");
- System.getProperties().remove("http.proxyPort");
- System.getProperties().remove("https.proxyHost");
- System.getProperties().remove("https.proxyPort");
自己去看SDK,果然,Android是提供單個接口訪問不帶代理的,不廢話,上代碼
- URL url = new URL(urlStr);
- urlConnection = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);
嗯,很實在,然后蝸牛又去看了一下OKhttp框架是否提供類似的操作,·······果然不愧是好框架:
- OkHttpClient client = new OkHttpClient().newBuilder().proxy(Proxy.NO_PROXY).build();
好了,蝸牛就只弄了這點,有錯請指出!!!!
自己調試的界面: