how to maintain variable cookies and sessions with jsoup?

前端 未结 2 1417
野性不改
野性不改 2020-12-14 05:16
public boolean isGood(String path)
{
    if (p != path)
    {
        good = false;
    }

    if (good)
    {
        try 
        {
            Connection connecti         


        
相关标签:
2条回答
  • 2020-12-14 05:29

    +1 for BalusC

    I changed some in your code and it works for me, so you get cookie from site and only than get Document

    public Document get(String url) throws IOException {
        Connection connection = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
        Connection.Response response = connection.execute();
        connection.cookies(response.cookies());
        return connection.get();
    }
    
    0 讨论(0)
  • 2020-12-14 05:47

    This code is very confusing. The flow is illogical and the exception handling is bad. The object reference comparisons like if (p != path) and if (cookys != cookies) makes no utter sense. To compare object's contents you need to use equals() method instead.

    To the point, I understand that you want to maintain cookies in a bunch of subsequent Jsoup requests on the same domain. In that case, you need to basically adhere the following flow:

    Map<String, String> cookies = new HashMap<String, String>();
    
    // First request.
    Connection connection1 = Jsoup.connect(url1);
    for (Entry<String, String> cookie : cookies.entrySet()) {
        connection1.cookie(cookie.getKey(), cookie.getValue());
    }
    Response response1 = connection1.execute();
    cookies.putAll(response1.cookies());
    Document document1 = response1.parse();
    // ...
    
    // Second request.
    Connection connection2 = Jsoup.connect(url2);
    for (Entry<String, String> cookie : cookies.entrySet()) {
        connection2.cookie(cookie.getKey(), cookie.getValue());
    }
    Response response2 = connection2.execute();
    cookies.putAll(response2.cookies());
    Document document2 = response2.parse();
    // ...
    
    // Third request.
    Connection connection3 = Jsoup.connect(url3);
    for (Entry<String, String> cookie : cookies.entrySet()) {
        connection3.cookie(cookie.getKey(), cookie.getValue());
    }
    Response response3 = connection3.execute();
    cookies.putAll(response3.cookies());
    Document document3 = response3.parse();
    // ...
    
    // Etc.
    

    This can be refactored to the following method:

    private Map<String, String> cookies = new HashMap<String, String>();
    
    public Document get(url) throws IOException {
        Connection connection = Jsoup.connect(url);
        for (Entry<String, String> cookie : cookies.entrySet()) {
            connection.cookie(cookie.getKey(), cookie.getValue());
        }
        Response response = connection.execute();
        cookies.putAll(response.cookies());
        return response.parse();
    }
    

    which can be used as

    YourJsoupWrapper jsoupWrapper = new YourJsoupWrapper();
    
    Document document1 = jsoupWrapper.get(url1);
    // ...
    
    Document document2 = jsoupWrapper.get(url2);
    // ...
    
    Document document3 = jsoupWrapper.get(url3);
    // ...
    

    Note that the upcoming Jsoup 1.6.2 will come with a new Connection#cookies(Map) method which should make that for loop everytime superfluous.

    0 讨论(0)
提交回复
热议问题