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