我正在使用供应商产品的自定义servlet引擎。我们的服务器由具有不同主机名的不同代理提供。假设主机名是host1.localhost.com
和host2.localhost.com
。
我们有以下servlet
public class MyServlet {
public void doGet(...) {
response.getOutputStream.write(request.getServerName().getBytes())
} }
我们遇到了一个问题,如果我们发出请求host1.localhost.com/my/servlet
,我们会在回复中看到host2.localhost.com/my/servlet
。
反编译供应商产品的代码显示,只要套接字保持活动状态,它们的servlet引擎就会缓存Host头。
为了重现这个问题,我写了一些低级套接字代码来发出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
我的问题是,servlet引擎是否通过缓存并为同一套接字连接返回相同的主机头来正确运行,还是应该重新解析HTTP头并更新缓存的主机头?我的想法是,由于HTTP假设是无状态的,因此HTTP请求中的任何信息都应该被重新解析和重新加载,甚至是主机头。
答案 0 :(得分:2)
对于客户端和服务器之间的连接方式,HTTP有点模糊:
http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-22#section-6.2
描述如何超出本规范的范围 通过各种传输或会话层建立连接 协议。
如果客户端为解析为同一IP的两个主机名使用一个持久连接,则看不出任何错误。它不应该在服务器端造成任何问题。