2009-09-21 37 views
8

我试图向需要cookie的网页发出请求。我使用HttpURLConnection类,但反应总是回来说Cookie与Java URLConnection关闭

<div class="body"><p>Your browser's cookie functionality is turned off. Please turn it on. 

我怎样才能使请求使得查询服务器认为我有饼干打开。我的代码是这样的。

private String readPage(String page) throws MalformedURLException { 
    try { 
     URL url = new URL(page); 
     HttpURLConnection uc = (HttpURLConnection) url.openConnection(); 
     uc.connect(); 

     InputStream in = uc.getInputStream(); 
     int v; 
     while((v = in.read()) != -1){ 
      sb.append((char)v); 
     } 
     in.close(); 
     uc.disconnect(); 
    } catch (IOException e){ 
     e.printStackTrace(); 
    } 
    return sb.toString(); 
} 

回答

10

你需要一个的CookieHandler添加为它处理的cookie的系统。在Java 6之前,JRE中没有CookieHandler的实现,你必须自己写。如果你是在Java 6中,你可以做到这一点,

CookieHandler.setDefault(new CookieManager()); 

,URLConnection的cookie处理是真的很弱。它几乎没有工作。它不能正确处理所有的cookie规则。如果您正在处理敏感的cookie(如身份验证),则应该使用Apache HttpClient。

+0

现在我需要弄清楚如何执行http代理身份验证。我曾与URLConnection合作,但现在我需要在这里弄清楚。 tsok,谷歌将prolly找到我的东西;)谢谢! – dharga 2009-09-22 13:01:52

1
uc.getHeaderFields() 
// get cookie (set-cookie) here 

URLConnection conn = url.openConnection(); 
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2"); 
conn.addRequestProperty("Referer", "http://xxxx"); 
conn.addRequestProperty("Cookie", "..."); 
-4

如果你想登录后刮去大量数据,你甚至可以与脚本网站刮板像WebHarvest(http://web-harvest.sourceforge.net/),我用它巨大的成功在我自己的一些项目的更好。

2

我认为服务器无法确定客户端不支持cookie的第一个请求。所以,可能服务器发送重定向。尝试禁用重定向:

uc.setInstanceFollowRedirects(false); 

然后你就可以从响应得到饼干和下一个请求使用它们(如果需要)。