Cómo establecer la encoding de solicitud en Tomcat?

Tengo un problema en mi aplicación web Java.

Aquí está el código en index.jsp:

      JSP Page   

Hello World!

Res:

Cuando wirehark una solicitud, mi navegador envía este encabezado:

 GET /kjd/index.jsp?q=%C3%A9 HTTP/1.1\r\n ... Accept-Charset: UTF-8,*\r\n 

Y el servidor Tomcat me devuelve esto:

 Content-Type: text/html;charset=UTF-8\r\n 

Pero si envío “é” (% C3% A9 en UTF-8) en mi formulario, en su lugar se muestra “Ã ©”.

Lo que entiendo es que el navegador envía una “é” codificada con UTF-8 (el% C3% A9).

Pero el servidor interpreta esto como ISO-8859-1. Entonces, el% C3 se decodifica como à y% A9 como ©, y luego devuelve la respuesta codificada en UTF-8.

En el código, las solicitudes deben decodificarse con UTF-8:

 request.setCharacterEncoding("UTF-8"); 

Pero, si envío esta url:

 http://localhost:8080/kjd/index.jsp?q=%E9 

el “% E9” se decodifica con ISO-8859-1 y aparece “é”.

¿Por qué no está funcionando? ¿Por qué las solicitudes se decodifican con ISO-8859-1?

Lo probé en Tomcat 6 y 7, y en Windows y Ubuntu.

El request.setCharacterEncoding("UTF-8"); solo establece la encoding del cuerpo de la solicitud (que ha sido utilizada por las solicitudes POST), no la encoding del URI de la solicitud (que ha sido utilizado por las solicitudes GET).

URIEncoding configurar el atributo URIEncoding en UTF-8 en el elemento de / /conf/server.xml / /conf/server.xml de Tomcat para que Tomcat /conf/server.xml el URI de solicitud (y la cadena de consulta) como UTF-8. Esto de hecho toma como norma ISO-8859-1. Consulte también la documentación de Tomcat HTTP Connector .

  

o para asegurar que el URI se analiza usando la misma encoding que el cuerpo:

  

Ver también:

  • Unicode – Cómo obtener los personajes correctos? – Solicitud de JSP / Servlet

Por favor, deshazte de esos scriptlets en tu JSP. El request.setCharacterEncoding("UTF-8"); es llamado en el momento equivocado. Sería demasiado tarde cuando haya utilizado correctamente un servlet para procesar la solicitud. Prefieres usar un filtro para esto. El response.setCharacterEncoding("UTF-8"); la parte ya está implícitamente hecha por pageEncoding="UTF-8" en la parte superior de JSP.

También recomiendo encarecidamente que reemplace el antiguo <%= request.getParameter("q") %> scriptlet por EL ${param.q} , o con JSTL XML escapando ${fn:escapeXml(param.q)} para evitar Ataques XSS .

solo necesita descomentar la porción inferior del código en conf / web.xml (servidor Tomcat web.xml) que filtra todas las solicitudes y las convierte en UTF-8.

     setCharacterEncodingFilter org.apache.catalina.filters.SetCharacterEncodingFilter  encoding UTF-8     setCharacterEncodingFilter /*  

Eso es. funciona bien en tomcat