У меня недавно была проблема с кодировкой сайтов, созданных сервлетом, которая возникала, если сервлеты были развернуты под Tomcat, но не под Jetty. Я провел небольшое исследование по этому поводу и упростил задачу до следующего сервлета:
public class TestServlet extends HttpServlet implements Servlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/plain");
Writer output = response.getWriter();
output.write("öäüÖÄÜß");
output.flush();
output.close();
}
}
Если я разверну его под Jetty и направлю в него браузер, он вернет ожидаемый результат. Данные возвращаются как ISO-8859-1, и если я загляну в заголовки, то Jetty возвращает:
Content-Type: text/plain; charset=iso-8859-1
Браузер обнаруживает кодировку из этого заголовка. Если я разверну тот же сервлет в Tomcat, в браузере появятся странные символы. Но Tomcat также возвращает данные в виде ISO-8859-1, разница в том, что ни один заголовок не говорит об этом. Поэтому браузер должен угадать кодировку, и это не так.
Мой вопрос такой: правильное ли поведение Tomcat или ошибка? И если это правильно, как я могу избежать этой проблемы? Конечно, я всегда могу добавить response.setCharacterEncoding("UTF-8");
к сервлету, но это означает, что я установил фиксированную кодировку, которую браузер может понимать или не понимать. Проблема более актуальна, если ни один браузер, кроме другой службы, не обращается к сервлету. Так как же мне наиболее гибко решить проблему?