配置公共响应标头肯定是使用HttpConfiguration 完成的,但它必须绑定到特定的ServerConnector 才能使该配置产生任何影响。
举个例子。
在jetty-project/embedded-jetty-cookbook 上作为HttpConfigExample 提供
注意embedded-jetty-cookbook上的分支,有jetty-9.4.x、jetty-10.0.x和jetty-11.0.x的例子
package org.eclipse.jetty.cookbook;
import java.io.IOException;
import java.net.URI;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.util.component.LifeCycle;
public class HttpConfigExample
{
public static void main(String[] args) throws Exception
{
Server server = new Server();
HttpConfiguration httpConfigOff = new HttpConfiguration();
httpConfigOff.setSendDateHeader(false);
httpConfigOff.setSendServerVersion(false);
httpConfigOff.setSendXPoweredBy(false);
ServerConnector connectorOff = new ServerConnector(server, new HttpConnectionFactory(httpConfigOff));
connectorOff.setPort(9090);
server.addConnector(connectorOff);
HttpConfiguration httpConfigDefault = new HttpConfiguration();
ServerConnector connectorDefault = new ServerConnector(server, new HttpConnectionFactory(httpConfigDefault));
connectorDefault.setPort(9191);
server.addConnector(connectorDefault);
server.setHandler(new AbstractHandler()
{
@Override
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
response.setCharacterEncoding("utf-8");
response.setContentType("text/plain");
response.getWriter().println("Greetings.");
baseRequest.setHandled(true);
}
});
HttpClient client = new HttpClient();
try
{
client.start();
server.start();
// Let's show what the default Response headers look like.
dumpResponse("Default Response", client.GET(URI.create("http://localhost:9191/")));
// Let's show what the default Response headers look like.
dumpResponse("Configured Response", client.GET(URI.create("http://localhost:9090/")));
}
finally
{
LifeCycle.stop(server);
LifeCycle.stop(client);
}
}
private static void dumpResponse(String heading, ContentResponse response)
{
System.out.printf("--- %s ---%n", heading);
System.out.printf("Request to %s%n", response.getRequest().getURI());
System.out.printf("Response: %s %d %s%n", response.getVersion(), response.getStatus(), response.getReason());
System.out.println(response.getHeaders());
System.out.println(response.getContentAsString());
}
}
这设置了 2 个ServerConnector 对象...
- 在端口 9191 上是默认的
HttpConfiguration
- 在端口 9090 上已配置(关闭了一些常见的响应标头)
HttpConfiguration
如果我们向两个端口发出一个简单的请求,我们可以看到结果...
--- Default Response ---
Request to http://localhost:9191/
Response: HTTP/1.1 200 OK
Date: Thu, 28 Oct 2021 13:22:41 GMT
Content-Type: text/plain;charset=UTF-8
Content-Length: 11
Server: Jetty(9.4.44.v20210927)
Greetings.
--- Configured Response ---
Request to http://localhost:9090/
Response: HTTP/1.1 200 OK
Content-Type: text/plain;charset=UTF-8
Content-Length: 11
Greetings.