日期:2014-05-18  浏览次数:20673 次

100分求助!用JAVA实现HTTP代理
对HTTP代理方面了解得不多,现在想研究一下,但是网上代码也不好找~各位如果有收藏的可否贡献一下!

------解决方案--------------------
使用Java实现HTTP代理的关键是解析HTTP协议,根据协议进行转发,这是实现HTTP代理的核心。其他在实际应用中需要考虑的就是如何实现多线程,并且考虑编写健壮性的线程转发。

在这里我们将不具体的介绍HTTP协议本身,因为关于这方面的资料网上已经有很多介绍了,我们将着重介绍一个简单的实现大体的步骤:

1. 对请求进行封装,封装出HttpRequest对象。这是第一步,必须先封装出这个对象,下一步才好做转发。由于代理不是HTTPServer,所以此时尚不知道要转发到什么地方,而且即便知道,由于不知道转发的内容,所以还无法封装出HttpResponse对象。

2. 封装出Dispatcher对象,Dispatcher对象负责转发,根据HttpRequest对象和要转发到的主机和端口号进行请求,并将响应封装成HttpResponse对象。

3. 修改协议内容:对HttpRequest对象的请求头和HttpResponse对象的响应头略微做修改。主要是为了使客户端浏览器坚信代理服务器就是真正的HttpServer。

4. Dispatcher对象将响应信息发送到请求端。

5. 结束本次对话。一个转发过程完成。

这样的一个Http代理程序本身除了具有一点练习编程的价值之外,几乎没有任何作用,因为关于HTTP代理这方面的程序已经有很多,而且实现的也非常好,但是如果我们加入点什么东西之后,它就有用了!马上开始!

1. 我们对Dispatcher略作修改,增加一个配置文件,该配置文件应该类似一般的WEB应用中的web.xml,对转发的url做配置,使我们可以截获对某一个url的请求,使之不转发或者需要干预转发。例如:如下定义:

new HttpProxyServer("192.168.1.2", 1234, "192.168.1.3", 80).startup();

上述代码定义了这样一个转发:当某个客户机浏览器向192.168.1.2的1234端口发送HTTP请求时候,我们希望客户端浏览器看到的是192.168.1.3的内容。

此时我们的配置文件中有如下配置(简单起见,直接使用web.xml的格式):

<servlet>

<servlet-name>test.servlet.Test1Servlet</servlet-name>

<servlet-class>test.servlet.Test1Servlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>test.servlet.Test1Servlet</servlet-name>

<url-pattern>/abc.html</url-pattern>

</servlet-mapping>

该配置说明当请求本机的/abc.html的时候,不需要转发,由test.servlet.Test1Servlet进行响应处理。test.servlet.Test1Servlet可能返回HelloWorld,而不是192.168.1.3的abc.html。而客户端浏览器则坚信这个就是abc.html。这实际上相当于我们给192.168.1.3略微做了点功能扩展!例如它的某个js脚本啊,我们认为不合适,我们需要运行一下我们自己的js,因为我们可能需要做个跨域的操作,改192.168.1.3的js不可能了,那加载一段我们自个儿的扩展还是可以滴.......,真是个不错的注意!嗯!

嗯,好了,这个时候就有很多事情可以做了......

OK,就到这里吧!


------解决方案--------------------
帮顶