晕,好难
你看看tomcat的源代码吧

解决方案 »

  1.   

    在WEB服务器里可以使用Filter过滤器实现。
      

  2.   

    我是想写个在客户端运行的程序来截获客户端对80端口的发送的请求访问,我不是狠了解 HaulZhu(倪郝)说的这个Filter,能不能给些代码,感谢!!!
      

  3.   

    截获?
    Filter只是一个过滤器,说到底还是一个servlet
      

  4.   

    大致应该这样:
    创建一个ServerSocket对象在80端口来等待外部连接,当有外部连接连接来时,ServerSocket会生成一个Socket1来与对方通信,这时可以取得对方的socket的ip地址(用socket的getInetAddress()方法),用这个InetAddress来创建另一个Socket2对象,用这个Socket2对象将Socket1的消息转发给InetAddress指向的服务器.在转发的过程中可以截获对方发来的消息,你可以存入一个文件里.
      

  5.   

    import java.io.*;
    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
    ========================================================
      

  6.   

    呵呵,实现这个基本很"难",这需要使用 TCP 协议的漏洞,我看了很多文章也没有找到方法,希望哪个高手能指点一下.
      

  7.   

    上面的那个朋友说的通过socket来获取连接信息,这个我想实现应该是没有问题的,但是我们自己写的Socket获取信息的同时,这个Http的请求我觉得可能实际上还是已经发送出去了!我们真真做到的不过是个监听到了发送的请求内容,然后利用这个监听到的信息重定向了,而没有真正的实现“截获”的目的。我理解的也就是IE还是对服务器做了http的请求,现在设想一下,当然我这里只是设想,如果网络是通路,那么服务器返回的结果和我们自己的socket返回的结果也许可以根据其中的标识来区分开来,但是如果网络是断路,IE就会收到一个错误信息,和我们自己的socket返回的结果,这样这样我们就要时时的分析IE请求返回的结果,我觉得这样是不理想的!!!
    实际上我们设想的是能够截获后然后重定向,不再希望请求也发送出去了!不知道我说的清楚不!!如果不清楚大家可以继续提问,感谢!
      

  8.   

    你是想截获 http包?如果这样的话我想应该没有问题!
    socket位于ISO模型的会话层和传输层之间,就是TCP/udp协议的上一层.而HTTP是应用层协议,即位于socket之上,而且http协议最终要打包成Tcp包进行传输的,这大家是知道的,所以理论上可以用socket截获完整的Http包.
    至于你说完全的截获,我想:那是当然可以的,因为对方的连接程序根本不会分辨它现在连接到的服务器是不是它"真正"想要连接的服务器.只要你的程序在 它 和 真正的服务器之间"截获"它,它当然将你作为"真正"的服务器进行对待了!
    我不知道我所说的是不是有点班门弄斧,或者说根本没有理解你的意思。仅当参考!
      

  9.   

    上面说的这个流程,我想应该是差不多的,其实对于一般的页面请求我理解底层也是通过socket传输的,能获得请求的数据,这点我也不怀疑!
    现在看看是不是有这样的问题,假设如果我们用一个socket来获取一个请求的,如果再开一个socket再在同一个端口来监听,是不是就得不到同样的信息了!
    我这样说其实也就是想表达我们自己的socket难道是可以把服务器的监听socket屏蔽掉嘛?我想这个应该做不到!!也就是两个socket应该都可以得到连接的请求,因为我们做到的只是监听到,而不是把连接请求拦截下了!
    其实这个问题,我现在也是处在考虑阶段,没有做过试验,如果大家有什么好的建议,都可以说说,算是探讨吧!!!适当的时候我会散分的!!感谢!!!
      

  10.   

    楼上说的是指自己的socket与HTTP服务器处在同一台机器上时端口冲突吧。如果把socket服务与HTTP服务放在一台机器上,就肯定有一个服务启动不起来(端口冲突造成后起的服务会失败)
    另外,客户端发出请求时,会直接指向HTTP服务器的80端口,那么这个Socket服务如何可以被请求到?如果让客户端只知道请求socket的服务,然后再由socket程序将请求再转发到http请求还有可能行得通。
      

  11.   

    可能是我没有说明白,不好意思,我的意思是我自己建立的socket在发请求的机器上,这个当然也是客户端!
      

  12.   

    还有就是bamboo123(竹) 说的,socket和http服务怎么能冲突,我不是很理解,这个socket是监听socket,也就是服务socket,如果这样冲突,那这样不是在服务器上不能写自己的socket监听80端口了!我不知道我是不是理解错了!交流!!
      

  13.   

    一个端口只能为一个进程使用,web服务器和开80端口的serversocket只能开一个,这就是冲突!
    如果你在客户端机器截获的话,我想,很难!
    我觉的java不可能实现.