JAVA如何监听ASP应用的HTTP信息

有一个正在运行的WEB系统(ASP开发), 现在需要针对这个系统做一些流量分析, 分析的内容包括
客户端IP
链接源(就是从哪个网站跳转过来的)
当前访问的是哪个页面
可以不改动这个WEB应用,从而实现这个需求吗? 个人想着是否可以通过JAVA去侦听WEB系统运行的端口,获取并解析HTTP的相关系统,不知是否可行. 有其它方式吗?
敬请板桥老师指点迷津
[该贴被icyiwh于2008-11-26 17:05修改过]
[该贴被icyiwh于2008-11-26 17:07修改过]
apache等都有日志的吧。

或者自己做个转发器Broker,将请求和响应都经过Java来处理。

目前考虑的解决方案如下: (原有的访问地址为http://www.name.com.cn,对应IP为 172.30.4.251:80)
更改原有WEB应用的侦听端口:80-->8080
1.用Socket来拦截172.30.4.251上的80端口,解析请求,然后把请求转发至8080端口;
2.Socket然后将8080端口的RESPONSE转发给客户端.

请教板桥老师:
1.这种方式是否可行;
2.另外, Socket好像只能获取客户端的IP及其访问的URL, 但是好像不能获取链接源(就是客户端从哪个网站跳转到本网站的), 如果这种方式不能获取, 有其它方式可以获取吗?
明确的说这样的方式可行。

但是这种开发的难度比较大,这个过程里涉及到了应用协议的解析、需要实现一个TCP协议网关。如果不是必要尽量避免这种底层的实现方式,从性能和潜在bug角度考虑都是比较难以控制的。

另外如果从这个角度去思考的话就不用再考虑Java参与实现了,性能是个问题。

目前我考虑是这样来实现:
1.HTTP代理侦听代理端口
2.获取客户端连接
3.解析请求
4.将请求转发给服务器
5.将服务器响应转发给客户端

int proxyPort = 8080;////这是HTTP代理侦听的端口
ServerSocket proxyServer = new ServerSocket(proxyPort);
////获取客户端请求
Socket client = proxyServer.accept();
//////建立一个代理到实际WEB服务器的连接
Socket proxy2Server = new Socket(realServerHost, realServerPort);
////获取客户端请求
InputStream inClient2Proxy = client.getInputStream();
////这个请求的流里面有我需要的信息, 也是真正的业务逻辑所在
process(inClient2Proxy);
OutputStream outProxy2Server = proxy2Server.getOutputStream();
////处理完成后,将这个请求转换到实际的WEB服务器
outputRequest2Server(inClient2Proxy, outProxy2Server);

////然后再把WEB服务器的响应转发给客户端
InputStream inServer2Proxy = proxy2Server.getInputStream();
OutputStream outProxy2Client = client.getOutputStream();
outputResponse2Client(inServer2Proxy, outProxy2Client)

这里面我只是涉及到了一个请求的解析, 而且解析的内容我只关心: 客户端IP, 访问的URL, 以及这个URL的Referer.
所以再次弱弱的问一句, 这个会影响性能吗? 会有多大程度的影响.
谢谢了先
[该贴被icyiwh于2008-11-27 14:02修改过]

这样实现的性能消耗还是比较可观的。

单独考虑JVM到系统的数据映射过程数量增加了2倍,甚至还牵扯到了操作系统的网络驱动层,而这个过程应该是比较缓慢的。在系统运作的过程中IO是一个比较耗时的过程。

另外你需要进行协议的解析,这种计算过程也不是Java的强项。最好用C++甚至用C实现,而且改为使用拦截器的方式,有一个使用C实现的很著名网络数据拦截器(名字我忘记了),很可能你能够直接使用他。他的工作方式是直接将你监听的端口收到的数据从网卡的驱动层拷贝出来一个副本进行操作,不会影响到原先的应用过程,这样你也不需要实现网关了。

我估计这样的实现方式下,你的系统响应性能的上限可能会降低1/5甚至更多。你可以实现一个很简单的原型测试一下。

另外,其实问题的关键是你到底需要什么样的性能上限,先研究一下这个业务指标得到结果之后再来考虑实现的方式。