Avevo recentemente un problema con la codifica dei siti Web generati da servlet, che si verificava se i servlet venivano distribuiti sotto Tomcat, ma non sotto Jetty. Ho fatto un po 'di ricerca su di esso e semplificato il problema al seguente servlet:Perché la codifica non è impostata in risposta da Tomcat? Come posso affrontarlo?
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();
}
}
Se schiero questo sotto Jetty e indirizzare il browser per esso, restituisce il risultato atteso. I dati vengono restituiti come ISO-8859-1 e se prendo uno sguardo nelle intestazioni, quindi Jetty ritorna:
Content-Type: text/plain; charset=iso-8859-1
Il browser rileva la codifica da questa intestazione. Se distribuisco lo stesso servlet in Tomcat, il browser mostra caratteri strani. Ma Tomcat restituisce anche i dati come ISO-8859-1, la differenza è che nessuna intestazione ne parla. Quindi il browser deve indovinare la codifica, e questo va storto.
La mia domanda è: il comportamento di Tomcat è corretto o un bug? E se è corretto, come posso evitare questo problema? Certo, posso sempre aggiungere response.setCharacterEncoding("UTF-8");
al servlet, ma ciò significa che ho impostato una codifica fissa, che il browser potrebbe o potrebbe non capire. Il problema è più rilevante, se nessun browser, ma un altro servizio accede al servlet. Quindi, come dovrei affrontare il problema nel modo più flessibile?
Btw: 'implementa Servlet' è superfluo come' HttpServlet' fa già questo. – BalusC