从输出中,我了解到网站主页确实会刷新并将请求重定向到其他页面,这在浏览器上是可以的,但在代码上不是。那么我该如何推进重定向呢?
try {
URL url = StringUtils.stringToURL(link);
URLConnection dbGatewayURL = url.openConnection();
dbGatewayURL.setConnectTimeout(timeout);
BufferedReader in = new BufferedReader(new InputStreamReader(
dbGatewayURL.getInputStream()));
StringBuffer responseData = new StringBuffer();
String line = "";
while ((line = in.readLine()) != null) {
responseData.append(line + "n");
}
输出是:
<HEAD>
<META HTTP-EQUIV=REFRESH CONTENT="0;URL=/sites/engbm">
</HEAD>
当我尝试httpUrlConn.setRequestMethod("HEAD");
时,这会引发意外的文件结尾异常
您必须解析输出并查找<META HTTP-EQUIV=REFRESH>
标记。它告诉浏览器,内容本身中包含了相应的响应头。在这种情况下,它告诉浏览器在0
秒后重定向到/sites/engbm
。只是为了明确META HTTP-EQUIV
的用途:http://www.w3schools.com/tags/att_meta_http_equiv.asp
http equiv属性为内容属性的信息/值提供了一个http标头。
http equiv属性可用于模拟http响应标头。
如果设置了name属性,则不应设置http-equiv属性。
关于:
当我尝试
httpUrlConn.setRequestMethod("HEAD");
时,这会引发意外的文件结尾异常
这是因为HEAD
请求没有响应主体。
您需要仔细查看http标头。重定向的响应代码为302。每个重定向响应都带有一个位置标头。典型的重定向响应如下
HTTP/1.1 301 Moved Permanently
Location: http://www.example.org/
Content-Type: text/html
Content-Length: 174
读取响应代码(HttpURLConnection.getResponseCode()
),然后读取标头并获得Location
标头的值,并对此URL进行新的请求。