我正在尝试向需要Cookie的网页发出请求。我正在使用HTTPUrlConnection,但响应总是回来说
<div class="body"><p>Your browser's cookie functionality is turned off. Please turn it on.
如何发出请求以使查询的服务器认为我已启用cookie。我的代码就是这样的。
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();
}
答案 0 :(得分:10)
您需要向系统添加CookieHandler才能处理cookie。在Java 6之前,JRE中没有CookieHandler实现,您必须自己编写。如果您使用的是Java 6,则可以执行此操作,
CookieHandler.setDefault(new CookieManager());
URLConnection的cookie处理非常弱。它几乎没有用。它无法正确处理所有cookie规则。如果您正在处理敏感的cookie,如身份验证,则应使用Apache HttpClient。
答案 1 :(得分:2)
我认为服务器无法在第一次请求时确定客户端不支持cookie。所以,可能服务器发送重定向。尝试禁用重定向:
uc.setInstanceFollowRedirects(false);
然后,您将能够从响应中获取Cookie并在下次请求时使用它们(如果需要)。
答案 2 :(得分: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", "...");
答案 3 :(得分:-4)
如果您在登录后尝试抓取大量数据,您甚至可以使用像WebHarvest(http://web-harvest.sourceforge.net/)这样的脚本网络刮刀更好一些我已经用它来取得一些成功自己的项目。