晕,好难
你看看tomcat的源代码吧
你看看tomcat的源代码吧
解决方案 »
- =========象ie7这样的多tab浏览器中,怎样判断tab,是关闭还是刷新,急!=========
- java高手请进 如何在窗体中嵌入网页?
- 关于MAP,SET,LIST的问题,望大家帮忙
- 画图的问题
- UltraEdit开发Java配置问题
- 小程序 急 在线等
- ****eclipse不能用啊,为什么啊,有以下提示***
- 请问如何用java绘制一幅png图像?
- 请教高手(100分):关于B/S中的中文输入法问题。用微软的智能ABC在jTextArea老出错
- 动画与media包的问题!
- 超值问题! 用JAVA如何获取通过HTTP协议传递的内容(包含HTTP头内容,就是整个消息的内容)
- 如何判断鼠标左右键被按下的先后顺序??
Filter只是一个过滤器,说到底还是一个servlet
创建一个ServerSocket对象在80端口来等待外部连接,当有外部连接连接来时,ServerSocket会生成一个Socket1来与对方通信,这时可以取得对方的socket的ip地址(用socket的getInetAddress()方法),用这个InetAddress来创建另一个Socket2对象,用这个Socket2对象将Socket1的消息转发给InetAddress指向的服务器.在转发的过程中可以截获对方发来的消息,你可以存入一个文件里.
import java.net.ServerSocket;
import java.net.Socket;
import java.net.InetAddress;/*
* Created on 2005-2-21
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*//**
* @author Administrator
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class Client {
public ServerSocket server=null;
public Socket sock1=null;
public Socket sock2=null;
public InputStream in=null;
public OutputStream out=null;
public File f=null;
public FileInputStream fin=null;
public FileOutputStream fout=null;
public byte[] bytes=null;
public Client(){
try{
server=new ServerSocket(80);
f=new File("msg");
fin=new FileInputStream(f);
fout=new FileOutputStream(f);
}catch(IOException e){
e.printStackTrace();
}
bytes=new byte[1024];
}
public void printMsg(){
try{
sock1=server.accept();
sock2=new Socket(sock1.getInetAddress(),80);
in=sock1.getInputStream();
out=sock2.getOutputStream();
int len;
while((len=in.read(bytes))>0){
System.out.println("Connecting...");
fout.write(bytes,0,len);
out.write(bytes,0,len);
}
fin.close();
fout.close();
in.close();
out.close();
if(!sock1.isClosed()) sock1.close();
if(!sock2.isClosed()) sock2.close();
server.close();
}catch(IOException e){
e.printStackTrace();
}
}
public static void main(String[] args) {
Client c=new Client();
c.printMsg();
}
}
完全可行!以下是截获的连接消息:
=======================================================
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)
Host: localhost
Connection: Keep-Alive
========================================================
实际上我们设想的是能够截获后然后重定向,不再希望请求也发送出去了!不知道我说的清楚不!!如果不清楚大家可以继续提问,感谢!
socket位于ISO模型的会话层和传输层之间,就是TCP/udp协议的上一层.而HTTP是应用层协议,即位于socket之上,而且http协议最终要打包成Tcp包进行传输的,这大家是知道的,所以理论上可以用socket截获完整的Http包.
至于你说完全的截获,我想:那是当然可以的,因为对方的连接程序根本不会分辨它现在连接到的服务器是不是它"真正"想要连接的服务器.只要你的程序在 它 和 真正的服务器之间"截获"它,它当然将你作为"真正"的服务器进行对待了!
我不知道我所说的是不是有点班门弄斧,或者说根本没有理解你的意思。仅当参考!
现在看看是不是有这样的问题,假设如果我们用一个socket来获取一个请求的,如果再开一个socket再在同一个端口来监听,是不是就得不到同样的信息了!
我这样说其实也就是想表达我们自己的socket难道是可以把服务器的监听socket屏蔽掉嘛?我想这个应该做不到!!也就是两个socket应该都可以得到连接的请求,因为我们做到的只是监听到,而不是把连接请求拦截下了!
其实这个问题,我现在也是处在考虑阶段,没有做过试验,如果大家有什么好的建议,都可以说说,算是探讨吧!!!适当的时候我会散分的!!感谢!!!
另外,客户端发出请求时,会直接指向HTTP服务器的80端口,那么这个Socket服务如何可以被请求到?如果让客户端只知道请求socket的服务,然后再由socket程序将请求再转发到http请求还有可能行得通。
如果你在客户端机器截获的话,我想,很难!
我觉的java不可能实现.