2011-10-11 75 views
5
public boolean isGood(String path) 
{ 
    if (p != path) 
    { 
     good = false; 
    } 

    if (good) 
    { 
     try 
     { 
      Connection connection = Jsoup.connect(path); 
      Map<String, String> cookys = Jsoup.connect(path).response().cookies(); 

      if (cookys != cookies) 
       cookies = cookys; 

      for (Entry<String, String> cookie : cookies.entrySet()) 
      { 
       connection.cookie(cookie.getKey(), cookie.getValue()); 
      } 

      Doc = connection.get(); 
      good = true; 
     } 
     catch (Exception e) 
     { 
      rstring = e.getMessage().toString(); 
      good = false; 
     } 
    } 
    else 
    { 
     try 
     { 
      Response response = Jsoup.connect(path).execute(); 
      cookies = response.cookies(); 
      Doc = response.parse(); 
      good = true; 
     } 
     catch (Exception e) 
     { 
      rstring = e.getMessage().toString(); 
      good = false; 
     } 
    }  
    return good; 
} 

此方法不正确。我想知道的是一种不知道cookie会存在的方式,能够处理cookie更改以及维护会话。如何使用jsoup维护可变的cookie和会话?

我正在为我的简单机器论坛编写一个应用程序,并在您点击某些自定义行为时更改其Cookie配置。

但是,如果应用程序对我的网站很好,我将发布一个版本供其他论坛使用。

我知道我正朝着正确的方向前进,但逻辑有点踢我的屁股。

任何意见将不胜感激。

+0

除了BalusC的意见,这是不可能的'p!=路径'事情是你真正的意思,尽管它是*可能*。 –

回答

12

这段代码很混乱。流程不合逻辑,异常处理不好。像if (p != path)if (cookys != cookies)这样的对象参考比较没有任何意义。要比较对象的内容,您需要改为使用equals()方法。

至此,我明白你希望在同一个域上的一堆随后的Jsoup请求中维护cookie。在这种情况下,你需要基本上坚持以下流程:

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. 

这可重构以下方法:

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(); 
} 

可以用来作为

YourJsoupWrapper jsoupWrapper = new YourJsoupWrapper(); 

Document document1 = jsoupWrapper.get(url1); 
// ... 

Document document2 = jsoupWrapper.get(url2); 
// ... 

Document document3 = jsoupWrapper.get(url3); 
// ... 

请注意,即将推出的Jsoup 1.6.2将附带一个新的Connection#cookies(Map)方法,该方法应该使for每次循环多余。

+0

我非常感谢你。我搜索并搜索了一个正确的做法。这种方式肯定比我尝试的方式更好。大声笑 – texasman1979

+0

来自未来的人!出于某种原因,我发现JSoup非常方便。只是我的两分钱就是在当前JSoup库中有一个名为cookies(Map cookies)的方法,它添加了键/值对。所以上面的foreach可以替换为:connection.cookies(cookies) –

+0

你可以做connection.cookies(cookies)而不是for循环 – caub

1

+1 BalusC

我在你的代码改变了一些,它为我的作品,让你从网站得到的cookie,只比获得文档

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(); 
}