java - caracteres - ¿Cómo configurar la codificación de solicitud en Tomcat?
jsp caracteres especiales (2)
Tengo un problema en mi aplicación web Java.
Aquí está el código en index.jsp:
<%@page contentType="text/html" pageEncoding="UTF-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<% request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Hello World!</h1>
<form action="index.jsp" method="get">
<input type="text" name="q"/>
</form>
Res: <%= request.getParameter("q") %>
</body>
</html>
Cuando cableado 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 "é" en mi formulario (% C3% A9 en UTF-8), 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. Así que el% C3 se decodifica como à y% A9 como ©, y luego envía 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" está decoculado con ISO-8859-1 y se muestra una "é".
¿Por qué no funciona esto? ¿Por qué las solicitudes se decodifican con ISO-8859-1?
Lo he probado en Tomcat 6 y 7, y en Windows y Ubuntu.
El request.setCharacterEncoding("UTF-8");
solo establece la codificación del cuerpo de la solicitud (que ha sido utilizada por las solicitudes POST), no la codificación de la URI de la solicitud (que ha sido utilizada por las solicitudes GET).
URIEncoding
establecer el atributo URIEncoding
en UTF-8
en el elemento <Connector>
de /conf/server.xml
de Tomcat para que Tomcat /conf/server.xml
el URI de solicitud (y la cadena de consulta) como UTF-8. De hecho, esto por defecto es ISO-8859-1. Consulte también la documentación del conector HTTP de Tomcat .
<Connector ... URIEncoding="UTF-8">
o para asegurarse de que el URI se analiza utilizando la misma codificación que el cuerpo:
<Connector ... useBodyEncodingForURI="true">
Ver también:
Por favor, deshacerse de esos scriptlets en su JSP. El request.setCharacterEncoding("UTF-8");
Se llama en el momento equivocado. Sería demasiado tarde siempre que haya utilizado correctamente un Servlet para procesar la solicitud. Prefieres usar un filter para esto. El response.setCharacterEncoding("UTF-8");
La parte ya está implícitamente realizada por pageEncoding="UTF-8"
en la parte superior de JSP.
También recomiendo reemplazar el scriptlet <%= request.getParameter("q") %>
antiguo por EL ${param.q}
, o con JSTL XML escaping ${fn:escapeXml(param.q)}
para evitar Ataques XSS .
solo necesita descomentar la parte inferior del código en conf / web.xml (servidor web.xml de Tomcat) que filtra todas las solicitudes y las convierte a UTF-8.
<!-- A filter that sets character encoding that is used to decode -->
<!-- parameters in a POST request -->
<filter>
<filter-name>setCharacterEncodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!-- The mapping for the Set Character Encoding Filter -->
<filter-mapping>
<filter-name>setCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Eso es. funciona bien en Tomcat