【问题标题】:One socket, multiple http request, different Host header but server returns cached Host header一个套接字,多个 http 请求,不同的 Host 标头,但服务器返回缓存的 Host 标头
【发布时间】:2013-05-12 02:52:11
【问题描述】:

我正在使用供应商产品的自定义 servlet 引擎。我们的服务器前面是具有不同主机名的不同代理。假设主机名是host1.localhost.comhost2.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 请求中的任何信息都应该重新解析和重新加载,甚至是主机头。

【问题讨论】:

    标签: java http servlets


    【解决方案1】:

    HTTP 对客户端和服务器之间的连接方式有点模糊:

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

    如何描述超出了本规范的范围 连接是通过各种传输层或会话层建立的 协议。

    如果客户端对解析为同一 IP 的两个主机名使用一个持久连接,我看不出有什么问题。应该不会在服务器端造成任何问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 2013-01-28
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多