Recientemente tuve un problema con la codificación de sitios web generados por servlet, que ocurría si los servlets se implementaban en Tomcat, pero no en Jetty. Hice un poco de investigación sobre el tema y simplificado el problema a la siguiente servlet:¿Por qué Tomcat no ha configurado ninguna codificación? ¿Cómo puedo lidiar con eso?
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();
}
}
Si puedo implementar esto bajo el embarcadero y dirigir el navegador a ella, se devuelve el resultado esperado. Los datos se devuelven como ISO-8859-1 y si echo un vistazo a las cabeceras, a continuación, vuelve embarcadero:
Content-Type: text/plain; charset=iso-8859-1
El navegador detecta la codificación de esta cabecera. Si despliego el mismo servlet en Tomcat, el navegador muestra caracteres extraños. Pero Tomcat también devuelve los datos como ISO-8859-1, la diferencia es que ningún encabezado lo menciona. Entonces el navegador tiene que adivinar la codificación, y eso va mal.
Mi pregunta es, ¿es correcto el comportamiento de Tomcat o un error? Y si es correcto, ¿cómo puedo evitar este problema? Claro, siempre puedo agregar response.setCharacterEncoding("UTF-8");
al servlet, pero eso significa que establezco una codificación fija, que el navegador puede o no comprender. El problema es más relevante, si ningún navegador sino otro servicio accede al servlet. Entonces, ¿cómo debo tratar el problema de la manera más flexible?
BTW: 'implementa Servlet' es superflua, ya que' HttpServlet' ya se hace eso. – BalusC