2013-05-17 3 views
6

ベンダー製品のカスタムサーブレットエンジンを使用しています。私たちのサーバーは、異なるホスト名を持つ異なるプロキシによって処理されています。ホスト名がhost1.localhost.comおよびhost2.localhost.comであると仮定します。私たちは、サーブレット1つのソケット、複数のhttp要求、異なるホストヘッダーがサーバーにキャッシュされたホストヘッダーを返します

public class MyServlet { 

    public void doGet(...) { 

      response.getOutputStream.write(request.getServerName().getBytes()) 
} } 

次いる

は、我々はいくつかの回は、我々は我々が実際に応答してhost2.localhost.com/my/servletを見る要求host1.localhost.com/my/servletを行う場合は、その問題に遭遇しました。

ベンダー製品のコードをコンパイルしていないと、ソケットが有効になっている限り、サーブレットエンジンがHostヘッダーをキャッシュすることが明らかになりました。

Socket s = new Socket(); 
s.connect(new InetSocketAddress("host2.localhost.com", 8080)); 
OutputStream os = s.getOutputStream(); 

/*this thread keeps printing stuff in the input stream*/ 
Thread t = new ResponsePrintThread(s.getInputStream()); 
t.start() 

os.write("GET /my/servlet/testservlet HTTP/1.1\r\n".getBytes()); 
os.write("Host: 12345\r\n".getBytes()); 
os.write("\r\n".getBytes()); 
os.flush(); 

os.write("GET /my/serlet/testservlet HTTP/1.1\r\n".getBytes()); 
os.write("Host: 7891011\r\n".getBytes()); 
os.write("\r\n".getBytes()); 
os.flush(); 

上記

12345 
12345 

を出力します。しかし、私は

12345 
7891011 
を期待する:私は、HTTPリクエストを行うためにいくつかの低レベルのソケットコードを書いて、問題が再現する試みにおいて

私の質問は、サーブレットエンジンが同じホストヘッダーをキャッシュして返すことによって正しく動作するかどうかです。同じソケット接続、またはHTTPヘッダーを再解析し、キャッシュされたホストヘッダーを更新する必要がありますか? My Thinkingは、HTTPがステートレスであると考えているので、HTTPリクエスト内の情報はすべて、ホストヘッダーであっても、再解析して再ロードする必要があります。

答えて

2

HTTPの接続は、クライアントとサーバーの間で行われる方法に少しあいまいです:

http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-22#section-6.2

それは 接続は、様々な交通機関やセッションを介して確立されている方法を説明するために、この仕様の範囲を超えています-layer プロトコル。

クライアントが同じIPを解決する2つのホスト名に対して1つの固定接続を使用していると、私は間違っていません。サーバー側で何の問題も起こらないはずです。

関連する問題