以下是我的示例HTTP服务器。我需要删除内容长度:'响应时生成的标头。我尝试了很多方法而没有成功。有没有办法从服务器响应中删除内容长度?
public class SimpleHttpServer {
public static void main(String[] args) throws Exception {
HttpServer server = HttpServer.create(new InetSocketAddress(9000), 0);
server.createContext("/test", new TestHandler());
server.setExecutor(null); // creates a default executor
server.start();
}
static class TestHandler implements HttpHandler {
public void handle(HttpExchange t) throws IOException {
byte[] response = "Welcome to Test Server..!!\n".getBytes();
t.sendResponseHeaders(200, response.length);
OutputStream os = t.getResponseBody();
os.write(response);
os.close();
}
}
}
答案 0 :(得分:1)
解决方法可能是:
t.sendResponseHeaders(200, 0);
请注意
如果响应长度参数为
0
,则使用分块传输编码,并且可以发送任意数量的数据。
答案 1 :(得分:0)
您必须在sendResponseHeaders
的{{3}}中指定的响应长度中发送0:
responseLength - if> 0,指定固定的响应体长度,并且必须将精确的字节数写入从getResponseBody()获取的流,否则如果等于0,则使用分块编码,并且可以写入任意数量的字节。 if< = -1,则不指定响应体长度,也不能写入响应体。
t.sendResponseHeaders(200, 0);
这意味着它不会向浏览器发送响应的长度,也不会发送Content-Length标头而是发送响应为javadoc,如您所示,这是一个测试,它可能没问题
Chunked transfer encoding是超文本传输协议(HTTP)1.1版中提供的流数据传输机制。在分块传输编码中,数据流被分成一系列非重叠的"块"。这些块彼此独立地发送和接收。在任何给定时间,发送方和接收方都不需要了解当前正在处理的块之外的数据流。
答案 2 :(得分:0)
Content-Length header is always set, unless it's 0 or -1;
如果您查看HttpExchange sendResponseHeaders()
的来源,您会找到此代码段,其中包含相关逻辑:
正如您在contentLen == 0
和!http10时看到的那样,此标头已添加"Transfer-encoding", "chunked"
。
您可以使用getResponseHeaders()
来返回标题的可变地图,以设置任何响应标头,除 "Date"
和"Transfer-encoding"
之外 - 阅读链接的来源代码,看看为什么。
207 if (contentLen == 0) {
208 if (http10) {
209 o.setWrappedStream (new UndefLengthOutputStream (this, ros));
210 close = true;
211 } else {
212 rspHdrs.set ("Transfer-encoding", "chunked");
213 o.setWrappedStream (new ChunkedOutputStream (this, ros));
214 }
215 } else {
216 if (contentLen == -1) {
217 noContentToSend = true;
218 contentLen = 0;
219 }
220 /* content len might already be set, eg to implement HEAD resp */
221 if (rspHdrs.getFirst ("Content-length") == null) {
222 rspHdrs.set ("Content-length", Long.toString(contentLen));
223 }
224 o.setWrappedStream (new FixedLengthOutputStream (this, ros, contentLen));
225 }
如果您需要更多灵活性,则需要使用其他构造,而不是普通HttpExchange
。类具有约束,默认行为并以某种方式构建。