ImageIO в сервлете: я должен закрыть выходной поток и как установить Content-Length? - PullRequest
0 голосов
/ 04 октября 2019

Я использую Jetty 9.4.21.v20190926 - в качестве отдельного сервера за HAProxy, а также я компилирую / запускаю свой собственный WAR-сервлет с ним:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" 
    "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/mypath</Set>
    <Set name="war">
        <SystemProperty name="jetty.base"/>/my-servlet-0.1-SNAPSHOT.war
    </Set>
</Configure>

Он обслуживает Websockets, GET, POST-запросы иработает очень хорошо за последние 2 года.

Теперь я хотел бы дополнительно сгенерировать файл PNG, используя ImageIO, и хотя приведенный ниже код работает для меня, у меня есть 2 вопроса, пожалуйста -

@Override
protected void doGet(HttpServletRequest httpReq, HttpServletResponse httpResp) throws ServletException, IOException {
    if ("board1".equals(httpReq.getServletPath()) {
        BufferedImage image = ImageIO.read(org.eclipse.jetty.util.Loader.getResource("game_board_1.png"));
        // here some more images are loaded + text and drawing happens
        httpResp.setStatus(HttpServletResponse.SC_OK);
        httpResp.setContentType("image/png");
        httpResp.setContentLength(12345); // question 1: should I call this or will Jetty add it automatically?
        ImageIO.write(image, "png", httpResp.getOutputStream());
        httpResp.getOutputStream().close();  // question 2: should I close the output stream here or not?
    }
}

Вопрос 1: Должен ли я явно указать Content-Length или Jetty добавит его автоматически для меня? И если мне придется установить его самому, как справиться с измененным размером из-за на лету gzip-сжатие?

Вопрос 2: Должен ли я позвонить httpResp.getOutputStream().close() в конце doGet () или, возможно, выходной поток все еще необходим для обслуживания других запросов из-за Keep-Alive?

...