ベンダー製品のカスタム サーブレット エンジンを使用しています。私たちのサーバーは、異なるホスト名を持つ異なるプロキシによってフロントされています。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 リクエスト内のすべての情報を再解析してリロードする必要があります。