1

我现在正在努力解决的问题如下。我在远程服务器上有一个 zip 存档。我开发的 eclipse 插件使用这个论坛的建议下载了这个存档:

//Connect readable channel to the URL
ReadableByteChannel rbc = Channels.newChannel(libraryUrl.openStream());
//Create local file
FileOutputStream fos = new FileOutputStream(libraryZipPath);
//Download the remote archive to the local file
fos.getChannel().transferFrom(rbc, 0, libraryUrl.openConnection().getContentLength()); 
//Close channel
fos.close();

我在服务器上有一个 html 文件,用于计算网页的访问统计信息。计数的javascript如下:

var data = '&r=' + escape(document.referrer) + '&n=' + escape(navigator.userAgent)
+ '&p=' + escape(navigator.userAgent) + '&g=' + escape(document.location.href);
if (navigator.userAgent.substring(0,1)>'3')
data = data + '&sd=' + screen.colorDepth + '&sw=' + escape(screen.width+'x'+screen.height);

document.write('<a href="http://www.1freecounter.com/stats.php?i=89959" target=\"_blank\">');
document.write('<img alt="Free Counter" border=0 hspace=0 '+'vspace=0 src="http://www.1freecounter.com/counter.php?i=89959' + data + '">');
document.write('</a>');

问题是:是否有可能使用这个 javascript 或 html 文件来计算存档文件的下载统计信息?

4

2 回答 2

1

您正在使用作为图形嵌入您网站的第三方网络计数器。当用户浏览器加载此图形时,第三方服务器会注意到访问并增加计数器。

这不适用于二进制下载,因为下载二进制文件时,不会请求 webcounter 图形。

您可以尝试让您的 Java 程序在下载二进制文件时也下载计数器图形。确保将 zip 存档的 URL 作为 Referrer HTTP 标头传递给图像下载,以便服务器上的脚本将其计为对它的访问。您必须使用 URLConnection 类来设置自定义 HTTP 标头,例如 Referrer。

于 2012-09-04T09:43:49.817 回答
1

谢谢你的回复,菲利普!

我已经想出了如何让它以一种非常简单的方式工作。让我们考虑上面示例中的计数器(“http://www.1freecounter.com/stats.php?i=89959”)。该地址的计数器总共需要 6 个参数:

r - 文档引用者,

n 和 p 是用户代理,由浏览器名称、操作系统名称、操作系统版本、浏览器版本等组成,

g是位置,

sd 和 sw 是颜色深度和屏幕大小(对于二进制文件,我们可以跳过这两个)。

然后,我们为计数请求形成一个字符串。例如,

String cntURL = "http://www.1freecounter.com/counter.php?i=89959&r="+
URLEncoder.encode("some string for a referrer","UTF-8") + "&n="+
URLEncoder.encode("browser name (OS name OS version) browser version", "UTF-8")+"&p="+
URLEncoder.encode("the same as above", "UTF-8")+"&g=<location string>";

请注意,参数被编码为 utf-8 字符集。否则,计数器将无法正确计数访问。

然后,简单地使用 URL 类,我们创建一个 URL 对象并打开一个 steam:

URL statsUrl = new URL(cntURL);
statsUrl.openStream();

这就对了!无需研究 http 标头中的参数。这只是形成一个适当的字符串来打开连接的问题。

我编写了一个简单的方法来检索请求所需的所有信息,并在我从服务器下载文件的方法中插入了对它的调用。

于 2012-09-13T16:23:51.403 回答