java - mvc - jquery ajax jsp
¿Por qué POST no respeta el juego de caracteres, pero una solicitud AJAX lo hace? tomcat 6 (5)
Tengo una aplicación basada en tomcat que necesita enviar un formulario capaz de manejar caracteres utf-8. Cuando se envía a través de ajax, los datos se devuelven correctamente desde getParameter () en utf-8. Cuando se envía a través de una publicación de formulario, los datos se devuelven de getParameter () en iso-8859-1.
Utilicé el violín y determiné que la única diferencia en las solicitudes es que el conjunto de caracteres = utf-8 se agrega al final del encabezado de tipo de contenido en la llamada ajax (como se esperaba, dado que envío el tipo de contenido explícitamente).
ContentType de ajax: "application / x-www-form-urlencoded; charset = utf-8"
ContentType de la forma: "application / x-www-form-urlencoded"
Tengo la siguiente configuración:
Publicación ajax (muestra los caracteres correctamente):
$.ajax( {
type : "POST",
url : "blah",
async : false,
contentType: "application/x-www-form-urlencoded; charset=utf-8",
data : data,
success : function(data) {
}
});
formulario post (salidas de caracteres en iso)
<form id="leadform" enctype="application/x-www-form-urlencoded; charset=utf-8" method="post" accept-charset="utf-8" action="{//app/path}">
declaración xml:
<?xml version="1.0" encoding="utf-8"?>
Doctype:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
meta tag:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
parámetros jvm:
-Dfile.encoding=UTF-8
También intenté usar request.setCharacterEncoding ("UTF-8"); pero parece que Tomcat simplemente lo ignora. No estoy usando la válvula RequestDumper.
Por lo que he leído, la codificación de datos POST depende principalmente de la codificación de página donde está el formulario. Por lo que puedo decir, mi página está codificada correctamente en utf-8.
El JSP de muestra de esta página funciona correctamente. Simplemente usa setCharacterEncoding ("UTF-8"); y analiza los datos que publica. http://wiki.apache.org/tomcat/FAQ/CharacterEncoding
Entonces, para resumir, la solicitud de publicación no envía el juego de caracteres como utf-8, a pesar de que la página está en utf-8, los parámetros del formulario que especifican utf-8, la declaración xml o cualquier otra cosa. He pasado la mayor parte de tres días en esto y me estoy quedando sin ideas. ¿Alguien puede ayudarme?
formulario post (salidas de caracteres en iso)
<form id="leadform" enctype="application/x-www-form-urlencoded; charset=utf-8" method="post" accept-charset="utf-8" action="{//app/path}">
No necesita especificar el juego de caracteres allí. El navegador usará el juego de caracteres que se especifica en el encabezado de respuesta HTTP.
Sólo
<form id="leadform" method="post" action="{//app/path}">
es suficiente.
declaración xml:
<?xml version="1.0" encoding="utf-8"?>
Irrelevante. Solo es relevante para los analizadores XML. Webbrowsers no analiza text/html
como XML. Esto solo es relevante para el lado del servidor (si está utilizando una tecnología de visualización basada en XML como Facelets o JSPX, en JSP simple esto es superfluo).
Doctype:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Irrelevante. Solo es relevante para los analizadores HTML. Además, no especifica ningún juego de caracteres. En cambio, se usará el que está en el encabezado de respuesta HTTP. Si no está usando una tecnología de visualización basada en XML como Facelets o JSPX, esto puede ser tan bueno como <!DOCTYPE html>
.
meta tag:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
Irrelevante. Solo es relevante cuando la página HTML se ha visto desde un disco local o se debe analizar localmente. En cambio, se usará el que está en el encabezado de respuesta HTTP.
parámetros jvm:
-Dfile.encoding=UTF-8
Irrelevante. Solo es relevante para Sun / Oracle (!) JVM analizar los archivos fuente.
También intenté usar
request.setCharacterEncoding("UTF-8");
pero parece que Tomcat simplemente lo ignora. No estoy usando la válvula RequestDumper.
Esto solo funcionará cuando el cuerpo de la solicitud aún no haya sido analizado (es decir, no haya llamado a getParameter()
y así sucesivamente de antemano). Debe llamar esto lo antes posible. Un Filter
es un lugar perfecto para esto. De lo contrario, será ignorado.
Por lo que he leído, la codificación de datos POST depende principalmente de la codificación de página donde está el formulario. Por lo que puedo decir, mi página está codificada correctamente en utf-8.
Depende del encabezado de respuesta HTTP.
Todo lo que necesita hacer son las siguientes tres cosas:
Agregue lo siguiente a la parte superior de su JSP:
<%@page pageEncoding="UTF-8" %>
Esto establecerá la codificación de respuesta a UTF-8 y establecerá el encabezado de respuesta en UTF-8.
Cree un
Filter
que haga lo siguiente en el métododoFilter()
:if (request.getCharacterEncoding() == null) { request.setCharacterEncoding("UTF-8"); } chain.doFilter(request, response);
Esto hará que el cuerpo de la solicitud POST se procesará como UTF-8.
Cambie la entrada
<Connector>
enTomcat/conf/server.xml
siguiente manera:<Connector (...) URIEncoding="UTF-8" />
Esto hará que las cadenas de consulta GET se procesen como UTF-8.
Ver también:
- Unicode - Cómo obtener personajes ¿verdad? - contiene información de fondo práctica y soluciones detalladas para desarrolladores web Java EE.
¿Has intentado especificar useBodyEncodingForURL="true"
en tu conf/server.xml
para el conector HTTP?
¿Has probado accept-charset="UTF-8"
? Como dijiste, los datos deberían codificarse de acuerdo con la codificación de la página; parece extraño que Tomcat esté ignorando eso. ¿En qué navegador estás probando esto?
Implementé un filtro basado en la información de esta publicación y ahora está funcionando. Sin embargo, esto todavía no explica por qué, aunque la página era UTF-8, el conjunto de caracteres utilizado por tomcat para interpretarlo era ISO-9951-1.
Prueba esto :
How do I change how POST parameters are interpreted?
Las solicitudes POST deben especificar la codificación de los parámetros y valores que envían. Como muchos clientes no pueden establecer una codificación explícita, se usa el valor predeterminado (ISO-8859-1). En muchos casos, esta no es la interpretación preferida, por lo que se puede utilizar un filtro javax.servlet.Filter para establecer codificaciones de solicitud. Escribir dicho filtro es trivial. Además, Tomcat ya viene con un ejemplo de filtro.
Por favor, eche un vistazo a:
5.x
webapps/servlets-examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java
webapps/jsp-examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java
6.x
webapps/examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java
Para obtener más información, consulte la URL siguiente http://wiki.apache.org/tomcat/FAQ/CharacterEncoding