HttpClient 4.4ログインのお知らせ(詳細手順)

17540 ワード

HttpClientはjava言語の次のhttpプロトコルをサポートするクライアントプログラミングキットであり、HTTPプロトコルのすべての方法を実現しているが、JSレンダリングはサポートされていない.私达はいくつかの小さいものをする时、いくつかのウェブサイトにログインして情报を得る必要があるかもしれませんが、HttpClientはあなたの良い手伝いで、くだらないことは多く言わないで、実戦に入ります.
ログインの実際の意味
HTTPが横行する今日、私たちは毎日いくつかのサイトにログインしていますが、ログインの意味は何ですか?まずクッキーについて理解しなければなりません.クッキーは、サーバからコマンドを送信し、ブラウザがローカルで読み書きするローカルに保存されている小さなファイルです.あるサイトにアクセスすると、ブラウザはサイトを閲覧するクッキー情報があるかどうかをチェックし、ある場合はアクセス要求を送信するときにこれらのコンテンツを携帯し、サーバはブラウザ送信要求のクッキー情報を読み取ることができ、要求に応答するときにクッキー情報を書くことができる.クッキー情報には、キー値、コンテンツ、有効期限、所属サイトが含まれます.
ここまでクッキーの話はもう終わりませんが、登録はいったいどういうことですか?ログインとは、サーバーがあなたのブラウザにクッキーを書くことです.もしあなたのコンピュータにクッキーを書くだけであれば、下心のある人がクッキーを偽造してもサイトにログインする機会があるので、サーバーはメモリに同じ情報を残します.このプロセスはsession と呼ばれています.Webサイトで終了ボタンをクリックすると、サーバはメモリのクッキーを消去し、ブラウザのログインに関するクッキーを消去します.これらを知っていれば、私たちは手に入れることができます.
二ログインキークッキーを見つける
ここではwiresharkでバッグをつかんで分析することができます.ホームページを開き、wiresharkを開き、ポートの傍受を開始し、ユーザー名とパスワードを入力し、ログインをクリックし、wiresharkが捕まえたパッケージを表示します.スクリーンショットは次のとおりです.
最初の図はブラウザpostがデータをコミットすることです.
2枚目の図は、送信された情報です.xsrf,password,remember_me,email,注意,コミットされた情報にはクッキーが含まれています,xsrfは、ホームページから入手できます.
3枚目の図はサーバが返す情報で、その状態が200であることに注意して、成功したことを示しています.
第4章図は、サーバが返すデータであり、3つのクッキー設定と、ログインが成功したかどうかの情報があることに注意してください.
上の手順で私たちは何を知ることができますか?まず,登録要求を送信する際に持つクッキー,postデータのフォーマット,次に登録用クッキー情報(4枚目の図)を入手できる.
三HttpClientを用いてログイン情報を構築する
HttpClientはどのようにブラウザをシミュレートしていますか?まず、ブラウザをシミュレートするためのHttpClientを作成する必要があります.次にpostリクエストを構築し、postデータ情報とcookieを追加します.詳細コードは次のとおりです.
import org.apache.http.*;
import org.apache.http.client.CookieStore;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.config.Lookup;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.cookie.CookieSpecProvider;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.impl.cookie.DefaultCookieSpecProvider;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/** * Created by gavin on 15-7-23. */
public class HttpClientTest {

    public static void main(String[] args) {
        //    HttpClient
        RequestConfig requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT).build();
        CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();
        try {
            //    get      _xsrf  
        HttpGet get = new HttpGet("http://www.zhihu.com/");
            //  _xsrf
            CloseableHttpResponse response = httpClient.execute(get,context);
            setCookie(response);
            String responseHtml = EntityUtils.toString(response.getEntity());
            String xsrfValue = responseHtml.split("<input type=\"hidden\" name=\"_xsrf\" value=\"")[1].split("\"/>")[0];
            System.out.println("xsrfValue:" + xsrfValue);
            response.close();

            //  post  
            List<NameValuePair> valuePairs = new LinkedList<NameValuePair>();
            valuePairs.add(new BasicNameValuePair("_xsrf", xsrfValue));
            valuePairs.add(new BasicNameValuePair("email", "[email protected]"));
            valuePairs.add(new BasicNameValuePair("password", "xxxxx"));
            valuePairs.add(new BasicNameValuePair("remember_me", "true"));
            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(valuePairs, Consts.UTF_8);

            //    post  
            HttpPost post = new HttpPost("http://www.zhihu.com/login/email");
            post.setHeader("Cookie", " cap_id=\"YjA5MjE0YzYyNGQ2NDY5NWJhMmFhN2YyY2EwODIwZjQ=|1437610072|e7cc307c0d2fe2ee84fd3ceb7f83d298156e37e0\"; ");

            //  post  
            post.setEntity(entity);
            HttpResponse httpResponse = httpClient.execute(post);
            //          
            printResponse(httpResponse);

            //    get  ,      cookie    
            HttpGet g = new HttpGet("http://www.zhihu.com/question/following");
            //  post     cookie  
            String c = setCookie(httpResponse);
            // cookie   get     
            g.setHeader("Cookie",c);
            CloseableHttpResponse r = httpClient.execute(g);
            String content = EntityUtils.toString(r.getEntity());
            System.out.println(content);
            r.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                httpClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void printResponse(HttpResponse httpResponse) throws ParseException, IOException {
        //         
        HttpEntity entity = httpResponse.getEntity();
        //     
        System.out.println("status:" + httpResponse.getStatusLine());
        System.out.println("headers:");
        HeaderIterator iterator = httpResponse.headerIterator();
        while (iterator.hasNext()) {
            System.out.println("\t" + iterator.next());
        }
        //           
        if (entity != null) {
            String responseString = EntityUtils.toString(entity);
            System.out.println("response length:" + responseString.length());
            System.out.println("response content:"
                    + responseString.replace("\r
"
, "")); } } public static Map<String,String> cookieMap = new HashMap<String, String>(64); // cookie public static String setCookie(HttpResponse httpResponse) { System.out.println("----setCookieStore"); Header headers[] = httpResponse.getHeaders("Set-Cookie"); if (headers == null || headers.length==0) { System.out.println("----there are no cookies"); return null; } String cookie = ""; for (int i = 0; i < headers.length; i++) { cookie += headers[i].getValue(); if(i != headers.length-1) { cookie += ";"; } } String cookies[] = cookie.split(";"); for (String c : cookies) { c = c.trim(); if(cookieMap.containsKey(c.split("=")[0])) { cookieMap.remove(c.split("=")[0]); } cookieMap.put(c.split("=")[0], c.split("=").length == 1 ? "":(c.split("=").length ==2?c.split("=")[1]:c.split("=",2)[1])); } System.out.println("----setCookieStore success"); String cookiesTmp = ""; for (String key :cookieMap.keySet()) { cookiesTmp +=key+"="+cookieMap.get(key)+";"; } return cookiesTmp.substring(0,cookiesTmp.length()-2); } }

コードの流れは次のとおりです.
知っているトップページからxsrf情報を取得します.
postリクエストにはクッキー情報が必要ですが、最初のステップではクッキーが得られませんでした.ブラウザで自分でクッキーを見つけて追加してください.上のクッキーは私が見つけました.
postリクエストを送信し、ログイン用クッキーを得る
ログインが必要なサブページを任意に探し、得られたクッキーをリクエストヘッダに書き込み、リクエストをコミットし、ログインに成功したかどうかを確認します.
四結果検証
最初の図はクッキーを取得してログインに成功したことを示しています
2枚目の図はログインが必要なインタフェースに入ったことを示しています
まとめ
インタフェースにログインして情報を取得する必要がある場合、ログインが実際に何をしたのかを知る必要があります.それはクッキー、postデータの読み書きです.
クッキーを取得する場合は、応答ヘッダから取得する必要があり、サーバから新しいクッキー情報が送信された場合は、タイムリーに書き込む必要があります.
私たちがウェブサイトにログインできるとき、どのようにその内容を操作するか、ここではjsoup、良心ライブラリ、jquery操作モードを模倣することをお勧めします.
 
 
https://segmentfault.com/a/1190000003013451