Скрыть версию сервера из заголовка в jetty

#eclipse #jetty #embedded-jetty

Вопрос:

Я знаю config.setSendServerVersion(false); должен скрыть версию сервера из заголовка.

Но этого не происходит, даже если я отлаживаю код, в который попадаю

     public void setSendServerVersion(boolean sendServerVersion) {
        this._sendServerVersion = sendServerVersion;
    }
 

И обнаружил, что sendServerVersion всегда true, даже если мы передаем false.

Вот как я звоню

     HttpConfiguration http_config = new HttpConfiguration();
    http_config.setOutputBufferSize(32768);
    http_config.setSendServerVersion(false);
 

Может кто-нибудь помочь мне с тем, как удалить сервер заголовка?

     Content-Type: text/html;charset=utf-8
    Date: Thu, 28 Oct 2021 10:57:29 GMT
    Server: Jetty(9.4.42.v20210604)
    Strict-Transport-Security: max-age=31556926; includeSubDomains
    Transfer-Encoding: chunked
    .
    .
    .
 

Комментарии:

1. Как вы используете HttpConfiguration? Он должен быть передан в конкретный ServerConnector через определенный ConnectionFactory.

2. Покажите, как вы создаете и настраиваете Server объект перед вызовом этого блока кода.

Ответ №1:

Настройка общих заголовков ответов, безусловно, выполняется с 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.