Red de conocimiento informático - Conocimiento informático - Cómo resolver el problema confuso de JavaWeb

Cómo resolver el problema confuso de JavaWeb

La parte de la URL en la línea de solicitud debe estar codificada en el formulario application/x-www-form-URL. El juego de caracteres utilizado en la codificación es el juego de caracteres utilizado cuando la página web actual se muestra en el navegador.

Hay dos clases en el JDK que manejan datos de tipo aplicación/x-www-form-urlencoded, son URLEncoder y URLDecoder. Cuando los datos de una página web deben codificarse manualmente, se puede utilizar la clase URLEncoder para completar el trabajo de codificación. Los lugares donde se requiere el procesamiento manual de codificación de URL incluyen:

Enlaces (

Formularios enviados por correo (

Por ejemplo, un enlace como este no debería estar en una página web). página Generar:

? ¿Copiar? - ? ¿Ortografía incorrecta?

& ltAnswer? "/hello/checkUser.html? Opt= Chino >Verificación de usuario"

La forma correcta de escribirlo es:

[xhtml]? Copiar

& lt! - ?¿Cuáles son los resultados de usar el juego de caracteres UTF-8 para la codificación de URL? /p>

& ltAnswer? %E6%96%87 " >Autenticación de usuario

Para este propósito, una solución puede usar un lenguaje de secuencias de comandos para manejar URLEncoding en la página JSP. Por ejemplo:

[xhtml]? ¿Ver sin formato?

& lt% @page? import = "Java . net . URL encoder" %> opt = & lt%=URLEncoder.encode("Chinese",?"UTF-8")% >& gtAutenticación de usuario

Procesamiento de codificación del cuerpo de la solicitud

Solo cuerpo de la solicitud Generado en la publicación -Modo de envío. El método de codificación del cuerpo de la solicitud se especifica mediante el atributo de etiqueta enctype del formulario. Al igual que la línea de solicitud, el conjunto de caracteres utilizado para codificar el cuerpo de la solicitud es el conjunto de caracteres utilizado cuando se muestra la página web actual en el. navegador El proceso de codificación lo completa automáticamente el navegador del cliente y no requiere programación adicional.

Procesamiento del servidor

En comparación con el cliente, el servidor proporciona dos tipos de procesamiento al recibir HTTP. solicitudes. Método de solicitud de datos: procesamiento automático o no procesamiento.

Generalmente, el servidor procesará automáticamente datos de tipo application/x-www-form-urlencoded (incluidos los datos en la línea de solicitud y el cuerpo de la solicitud). Para los servlets (clase de servlet o página web JSP), estos datos se pueden obtener a través de getParameter() o getParameterValues() del objeto de solicitud. Para otros datos de tipo MIME, el servidor HTTP entrega directamente el procesamiento al servlet correspondiente a HTTP. solicitud (clase de servlet o página web JSP).

Por ejemplo, el cliente envió el siguiente formulario:

[xhtml]? ¿Mirando la llanura? ¿Copiar

& lt formulario? acción="checkUser.html?opt=xxx"? método="POST "

& ltEntrar? tipo="texto"? nombre = "nombre de usuario"? valor = " yyy "/& gt;

& ltEnter? tipo="texto"? nombre = "nombre de usuario"? valor = " zzz "/& gt;

& ltinupt? tipo="enviar "? value = "submit"/& gt;

& lt/form & gt;

El Servlet (clase de Servlet o página JSP) correspondiente a checkUser.html se envía en el formulario y automáticamente Después del procesamiento, los datos se pueden obtener de las siguientes maneras:

[java]? ¿Mirando la llanura? ¿Copiar

cadena? ¿optar? =?solicitud . getparameter(" opt ");

Cadena[]? ¿usuario? =?request.getParameterValues("Username");

De forma predeterminada, el servidor realiza la decodificación de URL en los datos recibidos de la aplicación/x-www-form-urlencoded cuyo juego de caracteres es ISO-8859-1, los procesados El código interno de la cadena es ISO-8859-1. Para un servidor HTTP sin ninguna configuración adicional, nuestro servlet debe decodificar los datos y generar una cadena con UTF-16 (unicode) como código interno.

Por ejemplo, para los datos solicitados por el cliente que están codificados en el juego de caracteres UTF-8, el servlet necesita decodificarlos de la siguiente manera:

[java]? ¿Mirando la llanura? ¿Copiar

cadena? ¿optar? =?request . getparameter(" optar ");

Si? (opt!=null?& amp& amp?!"". ¿Igual a (opt))? {

¿optar? =?¿Nuevo? string(opt . getbytes(" ISO-8859-1 "),? "UTF-8");

}

Para evitar este proceso de codificación/decodificación adicional, también. es decir, informe al servidor el conjunto de caracteres utilizado por el cliente en URLEncoding, para procesar directamente la URLDecoding del conjunto de caracteres correspondiente. Diferentes servidores HTTP proporcionan diferentes soluciones.

Tome Tomcat como ejemplo. La forma en que Tomcat decodifica automáticamente las líneas de solicitud se especifica mediante el archivo de configuración de Tomcat server.xml. El atributo de etiqueta URIEncoding se proporciona en la etiqueta del conector en server.xml. conjunto de caracteres especificado, Tomcat decodificará automáticamente los datos codificados aplicación/x-www-form-URL en la línea de solicitud. Por ejemplo:

& ltTiempo de espera de conexión del conector="40000 "port="8080 "protocol="HTTP/1.1 "

codificación uri = " UTF-8 " puerto de redirección = " 8443 "/& gt;

Tomcat decodifica automáticamente el cuerpo de la solicitud estableciendo el valor de codificación de caracteres de la solicitud. Por ejemplo:

request . setcharacterencoding(" UTF-8 ");

Pero esta operación debe completarse en el filtro con anticipación y ya no es posible utilizar este método en un servlet. válido.

Un ejemplo de filtrado es el siguiente:

[java]? ¿Mirando la llanura? Copiar

¿Importar? Java .io .io excepción;

¿Importar? javax .servlet filtro;

¿Importar? javax .servlet cadena de filtro;

¿Importar? javax .servlet configuración de filtro;

¿Importar? javax .servlet excepción de servlet;

¿Importar? javax .servlet .solicitud de servlet;

¿Importar? javax .servlet respuesta;

¿Público? ¿clase? ¿Filtro de codificación de caracteres? ¿Utensilios? ¿Filtrar? {

¿Privado? ¿Cadena? Codificación;

¿Público? CharacterEncodingFilter()? {

¿Codificación? =?null

}

¿Público? ¿Vacío? destruir()? {

¿Codificación? =?null

}

¿Público? ¿Vacío? doFilter(¿ServletRequest? solicitud,? ServletResponse? respuesta,

¿cadena de filtros? cadena)? ¿Dejar caer? IOExcepción,? ¿Excepción de servlet? {

request.setCharacterEncoding(codificación);

chain.doFilter(solicitud, respuesta);

}

¿Público? ¿Vacío? init(¿FilterConfig? filterConfig)? ¿Dejar caer? ¿Excepción de servlet? {

¿Codificación? =?filtro de configuración . getinitparameter(" codificación ");

Si? (codificación?==?nulo?||?"".igual a (codificación))? {

¿Codificación? ="UTF-8";

}

}

}

Podemos usar este filtro en web.xml. La configuración correspondiente de web.xml es la siguiente:

[xhtml]? ¿Mirando la llanura? ¿Copiar

& ltFilter>

& ltFilter Name>Character? ¿codificación? Filtro</filter-name>

<filter-class>

Filtro de codificación de caracteres

</filter-class& gt;

<init- param>

<param-name>Codificación</param-name>

<param value& gtUTF-8</param-value>

& lt/init-param> ;

& lt/filter>

<Mapa del filtro>

<Nombre del filtro>¿Personaje? ¿codificación? filter</filter-name>

<url-pattern>/*</URL-pattern>

</filter-mapping> ;

A través de los dos métodos anteriores del preprocesamiento, los datos extraídos del servlet se pueden utilizar directamente sin decodificación ISO-8859-1.

Selección del juego de caracteres

En el proceso de procesamiento de datos de tipo application/x-www-form-urlencoded, otro tema que necesita atención es la selección del juego de caracteres. Como se mencionó anteriormente, el juego de caracteres utilizado en la codificación URL de la línea de solicitud y el cuerpo de la solicitud es el juego de caracteres utilizado cuando la página web actual se muestra en el navegador. Cuando un servidor HTTP genera una página HTML, esta información se proporciona en la respuesta HTTP.

Cuando un servidor HTTP recibe una solicitud HTTP, el servidor siempre necesita enviar una respuesta HTTP al cliente. El formato de los datos de respuesta HTTP es el mismo que el de los datos de solicitud HTTP y también consta de las siguientes partes:

& ltResponse line>

& ltTitle>

& ltCRLF> ;

[<Response-Text>& ltCRLF>]

A continuación se describe la información de respuesta del servidor al solicitar datos de una página web HTML:

HTTP/1.1 200 OK

Servidor: Apache-Coyote/1.1

Tipo de contenido: texto/html; juego de caracteres=UTF-8

Longitud del contenido: 265

Fecha: jueves 7 de diciembre de 2009 05:20:36 GMT

& lt! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transicional//ES " " http://www . w3 . org/TR/HTML 4/loose . DTD " & gt; & gt

& lthead & gt

& ltmeta http-equiv = " Tipo de contenido " Contenido = " text/html; charset=UTF-8 " >>p>

<title>test</title>

</head>

<body>

& lth 1 & gt;Hola mundo & lt/h 1 & gt;

& lt/body & gt;

& lt/html & gt;

[Fin]

El tipo de contenido del encabezado especifica el formato de datos del flujo de datos y el juego de caracteres utilizado para la visualización. Este indicador se puede especificar de las siguientes maneras:

1.Página web HTML

En HTML

& ltmeta http-equiv = " Content-Type " Content = " text/html; charset=UTF-8 " >>p>

2.Página web JSP

En la página JSP, excepto

& lt% @ idioma de la página = " Java " tipo de contenido = " texto/html; conjunto de caracteres = UTF-8 " codificación de página = " UTF-8 " % & gt;

3.Clase de servlet

Si quiero pasar La respuesta en la clase Servlet envía datos HTML al cliente, debe especificar el tipo de contenido antes de enviar. El código es el siguiente:

respuesta. set content type(" text/html; charset = UTF-8 ");

A través de los tres métodos anteriores, se puede garantizar que cuando los datos de respuesta se transmiten al cliente. Cuando se usa en un navegador, el navegador muestra su contenido con el método de decodificación y el juego de caracteres correctos.

Conclusión

En resumen, los tipos de contenido son el vínculo entre el cliente y el servidor.

A través de este indicador, ambas partes pueden codificar y decodificar correctamente los datos relevantes. Siempre que comprenda la función y el uso de Content-Type, el problema de los caracteres confusos se resolverá fácilmente.