我正在尝试使用以下代码来获取重定向的URL,然后对其进行一些处理。但是当我打印重定向的链接时,它会转到一个通知没有cookie的页面。如何在打开网址连接时启用cookie?
String url = "http://dx.doi.org/10.1137/0210059";
URLConnection con = new URL( url ).openConnection();
con.getInputStream();
String redirctedURL= con.getURL().toString();
System.out.println(redirctedURL);
答案 0 :(得分:0)
使用java UrlConnection
时,您应该自己处理cookie,阅读和设置Cookie,您可以使用setRequestProperty()
和getHeaderField()
URLConnection
剩下的部分是自己解析cookie,一个例子如何完成如下:
Map<String, String> cookie = new HashMap<>();
public URLConnection doConnctionWithCookies(URL url) {
StringBuilder builder = new StringBuilder();
builder.append("&");
for(Map.Entry<String,String> entry : cookie.entrySet()) {
builder.append(urlenEncode(entry.getKey()))
.append("=")
.append(urlenEncode(entry.getValue()))
.append("&");
}
builder.setLength(builder.length() - 1);
URLConnection con = url.openConnection();
con.setRequestProperty("Cookie", builder.toString());
con.connect();
// Parse cookie headers
List<String> setCookie = con.getHeaderFields().get("set-cookie");
// HTTP Spec state header fields MUST be case INsentive, I expet the above to work with all servers
if(setCookie == null)
return con;
// Parse all the cookies
for (String str : setCookie) {
String[] cookieKeyValue = str.split(";")[0].split("=",2);
if (cookieKeyValue.length != 2) {
continue;
}
cookie.put(urlenDecode(cookieKeyValue[0]), urlenDecode(cookieKeyValue[1]));
}
return con;
}
public String urlenEncode(String en) {
return URLEncoder.encode(en, "UTF-8");
}
public String urlenDecode(String en) {
return URLDecoder.decode(en, "UTF-8");
}
上述实现是一种非常愚蠢和粗暴的实现cookie方式,虽然它有效,但它完全忽略了cookie还可以有一个主机参数来防止在多个主机之间共享标识cookie的事实。
比自己做的更好的方法是使用专用于Apache HttpClient等任务的库。