Sto utilizzando un motore servlet personalizzato di un prodotto fornitore. Il nostro server è preceduto da proxy diversi con nomi host diversi. Supponendo che i nomi host siano host1.localhost.com
e host2.localhost.com
.Un socket, più richiesta HTTP, intestazione host diversa ma il server restituisce l'intestazione dell'host nella cache
Abbiamo seguito servlet
public class MyServlet {
public void doGet(...) {
response.getOutputStream.write(request.getServerName().getBytes())
} }
Abbiamo incontrato un problema che a volte se facciamo una richiesta host1.localhost.com/my/servlet
che vediamo in realtà vediamo host2.localhost.com/my/servlet
nella risposta.
La decompilazione del codice del prodotto fornitore ha rivelato che il proprio motore servlet memorizza nella cache l'intestazione Host finché il socket viene tenuto in vita.
Nel tentativo di riprodurre il problema che ho scritto un po 'di codice di basso presa livello per rendere le richieste 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();
È possibile che questo stamperà
12345
12345
Ma mi sarei aspettato
12345
7891011
La mia domanda è, il motore servlet si comporta correttamente memorizzando nella cache e restituendo la stessa intestazione host per la stessa connessione socket, o dovrebbe ri-analizzare le intestazioni HTTP e aggiornare l'intestazione dell'host nella cache? Il mio pensiero è che dal momento che HTTP suppone essere stateless, quindi qualsiasi informazione nella richiesta HTTP dovrebbe essere rianalizzata e ricaricata, anche l'intestazione host.