国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android使用OkHttp進行重定向攔截處理的方法

2019-12-12 00:35:24
字體:
來源:轉載
供稿:網友

網上有很多的OkHttp的教程,但是并沒有一個是關于如何OkHttp處理重定向的。這里的處理重定向的意思是:把重定向請求攔截下來,然后我們自己去請求重定向后的網頁,然后通過Jsoup解析自己需要的網頁數據。比如說我們模擬用戶登錄,然后自己去請求解析登陸后跳轉的網頁的內容。為什么要做這樣的一個東西呢?比如說課程表的查成績功能,就可以使用這種方法來獲取成績。

大概的原理是怎樣的呢?

我們先來說一下瀏覽器是怎么樣做用戶登錄的:瀏覽器會將你輸入的帳號和密碼通過POST請求攜帶過去,當然可能還會有其它字段,因為這個POST請求是我們網頁和服務器規定好的;登錄成功后,服務器會返回一個Set-Cookie請求頭字段,有了Cookie瀏覽器就可以通過GET請求訪問登錄后的網頁,注意沒有這個Cookie是無法請求登陸后的網頁的,GET請求必須設置Cookie請求頭字段,將服務器返回的Cookie攜帶過去。

明白了瀏覽器的行為之后,我們知道需要做的步驟就是4步:

  1. 自己做POST請求,并且不讓它自動重定向
  2. 我們拿到POST請求返回來的響應,獲取對應的Set-Cookie字段的內容
  3. 將該對應的內容添加到GET請求的Cookie請求頭字段中,然后做GET請求
  4. 獲取到的GET請求的響應體就是我們登陸后的網頁內容了,如果是靜態網頁可以通過Jsoup解析自己想要的信息了

我們需要通過抓包或者Chorme瀏覽器自帶的請求查看功能來查看POST請求提交的表單是怎樣的。Chorme按F12即可


輸入帳號密碼點擊登錄即可

點擊登陸后我們可以看到,控制面板出現了一堆訪問的記錄,第一個就是我們要找的,第一個的Status標志是302,302是重定向的意思。我們點擊(pass.asp)這個請求,然后查看它的POST的請求頭(點擊Headers)。

我們看到了一堆的Set-Cookie字段,字段對應的內容就是我們要攜帶做GET請求的

同時我們可以看到POST提交的表單內容,有些網站的提交參數是經過加密的,如果要做通用的,我們需要找到它加密的方法,做同樣的加密處理。

接下來使用OkHttp進行操作

由于OkHttp提供了自動攜帶Cookie進行請求的功能,于是我們可以很方便地進行處理了。

final OkHttpClient client = new OkHttpClient().newBuilder()        .followRedirects(false) //禁制OkHttp的重定向操作,我們自己處理重定向        .followSslRedirects(false)        .cookieJar(new LocalCookieJar())  //為OkHttp設置自動攜帶Cookie的功能        .build();//CookieJar是用于保存Cookie的class LocalCookieJar implements CookieJar{  List<Cookie> cookies;  @Override  public List<Cookie> loadForRequest(HttpUrl arg0) {     if (cookies != null)        return cookies;      return new ArrayList<Cookie>();  }  @Override  public void saveFromResponse(HttpUrl arg0, List<Cookie> cookies) {    this.cookies = cookies;  }  }

為什么設置CookieJar就能自動攜帶Cookie了呢?給你看一段OkHttp的源碼就知道了。

/**  * Populates request with defaults and cookies.  *  * <p>This client doesn't specify a default {@code Accept} header because it doesn't know what  * content types the application is interested in.  */ private Request networkRequest(Request request) throws IOException {  Request.Builder result = request.newBuilder();  //如果CookieJar的Cookie不為空,則設置Cookie字段  List<Cookie> cookies = client.cookieJar().loadForRequest(request.url());  if (!cookies.isEmpty()) {   result.header("Cookie", cookieHeader(cookies));  }  return result.build(); }

于是接下來我們就是做POST請求了

    final OkHttpClient client = new OkHttpClient().newBuilder()        .followRedirects(false)        .followSslRedirects(false)        .cookieJar(new LocalCookieJar())        .build();    //構造一個POST請求    RequestBody body = new FormBody.Builder().add("UserStyle", "student")        .add("user", "xxx").add("password", "xxx").build();            Request request = new Request.Builder().url("http://222.195.8.201/pass.asp").post(body).build();        client.newCall(request).enqueue(new Callback() {            @Override      public void onResponse(Call call, Response response) throws IOException {        /**         * 如果不用CookieJar,那么就要自己去解析返回的Set-Cookie字段,解析之后通過addHeader("Cookie", cookie)         * 添加Cookie請求頭         *///       List<String> cookies = response.headers("Set-Cookie");//       String cookie = "";//       for(int i=cookies.size()-1; i>=0; i--){//         cookie = cookie+ cookies.get(i).replace("path=/", "") + " ";//       }                //做GET請求        Request redirectRequest = new Request.Builder().url("http://222.195.8.201/student/asp/Select_Success.asp")//          .addHeader("Cookie", cookie)           .build();        //拿到登陸后操作的某個網頁的內容        Response response2 = client.newCall(redirectRequest).execute();        String result = response2.body().string();        System.out.println(result);      }            @Override      public void onFailure(Call arg0, IOException arg1) {              }    });

拿到內容后就可以自己進行內容的解析和展示了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 全州县| 鹤庆县| 长子县| 平利县| 杭锦后旗| 盈江县| 龙江县| 莱阳市| 芜湖县| 华坪县| 漳平市| 上杭县| 岫岩| 青铜峡市| 杭锦后旗| 独山县| 大冶市| 建宁县| 布尔津县| 嘉峪关市| 通江县| 宜阳县| 芒康县| 阿合奇县| 万全县| 齐齐哈尔市| 莱西市| 绥阳县| 周至县| 环江| 庆城县| 衢州市| 凤山市| 东方市| 项城市| 辽宁省| 荆州市| 平阴县| 宜兴市| 霍林郭勒市| 增城市|