6

ベンダー製品のカスタム サーブレット エンジンを使用しています。私たちのサーバーは、異なるホスト名を持つ異なるプロキシによってフロントされています。host1.localhost.comホスト名がと で あると仮定しますhost2.localhost.com

次のサーブレットがあります

public class MyServlet {

    public void doGet(...) {

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

リクエストを行うと、実際にレスポンスhost1.localhost.com/my/servletに表示されることがあるという問題が発生しました。host2.localhost.com/my/servlet

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

問題を再現するために、HTTP リクエストを作成するための低レベルのソケット コードをいくつか書きました。

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 はステートレスであると想定されているため、ホスト ヘッダーであっても、HTTP リクエスト内のすべての情報を再解析してリロードする必要があります。

4

1 に答える 1

2

HTTP は、クライアントとサーバー間の接続方法が少し曖昧です。

https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-p1-messaging-22#section-6.2

さまざまなトランスポートまたはセッション層プロトコルを介して接続が確立される方法を説明することは、この仕様の範囲を超えています。

クライアントが、同じ IP に解決される 2 つのホスト名に対して 1 つの永続的な接続を使用する場合、問題はないと思います。サーバー側で問題が発生することはありません。

于 2013-05-17T03:08:23.573 に答える