Principalmente enviamos solicitudes al servidor a través de dos formularios de envío: URL y formulario. El formulario de forma generalmente no tiene problemas confusos, y los problemas confusos están principalmente en la URL. A través de la introducción de los blogs anteriores, sabemos que el proceso de enviar la codificación de solicitudes al servidor por URL es realmente demasiado confuso. Diferentes sistemas operativos, diferentes navegadores y diferentes conjuntos de caracteres web conducirán a resultados de codificación completamente diferentes. ¿No es demasiado aterrador si los programadores quieren tener en cuenta todos los resultados? ¿Hay alguna manera de asegurarse de que el cliente solo use un método de codificación para emitir una solicitud al servidor?
¡tener! Aquí proporciono principalmente los siguientes métodos
1. JavaScript
El uso de la codificación de JavaScript no le da al navegador la oportunidad de intervenir. Después de codificar, envíe una solicitud al servidor y luego la decodifique en el servidor. Al dominar este método, necesitamos tres métodos de codificación de JavaScript: Escape (), Encodeuri () y EncodeUriComponent ().
escapar
La cadena especificada se codifica utilizando el conjunto de caracteres SIO Latin. Todos los caracteres no ASCII están codificados como cadenas en formato %xx, donde xx representa el número hexadecimal correspondiente al carácter en el conjunto de caracteres. Por ejemplo, la codificación correspondiente al formato es %20. Su método de decodificación correspondiente es unescape ().
De hecho, Escape () no se puede usar directamente para la codificación de URL, su función real es devolver el valor codificado unicode de un personaje. Por ejemplo, el resultado de "I Am CM" anterior es %U6211 %U662FCM, donde la codificación correspondiente de "I" es 6211, la codificación de "Sí" es 662F y la codificación de "CM" es CM.
Tenga en cuenta que Escape () no es correcto para la codificación "+". Pero sabemos que si hay espacios en la página web al enviar el formulario, se convertirá en + caracteres. Cuando el servidor procesa los datos, el signo + se procesará en espacios. Por lo tanto, tenga cuidado al usarlo.
encodeuri
Codificando la URL completa, utiliza el formato UTF-8 para emitir la cadena codificada. Sin embargo, Codeuri no codificará algunos caracteres especiales, excepto la codificación ASCII, como :! @ # $ & * () =: /; ? + '.
encodeuricomponent ()
Convierta las cadenas URI en cadenas de formato de escape en formato de codificación UTF-8. En comparación con Codeuri, CodeuricOponent será más poderoso, y se codificará para símbolos (; / ?: @ & = + $, #) que no están codificados en Encodeuri (). Sin embargo, CodeuricOponent solo codificará los componentes de la URL individualmente y no se utilizará para codificar toda la URL. El método de función de decodificación correspondiente decodeuricomponent.
Por supuesto, generalmente usamos la parte Codeuri para realizar operaciones de codificación. La llamada codificación y decodificación de JavaScript dos veces en el fondo es usar este método. Hay dos soluciones para resolver este problema en JavaScript: uno de transcodificación y dos métodos de transcodificación.
Transcoding una vez
Transcodificación de JavaScript:
var url = '/showMoblieqrcode.servlet?name=i am cm'; window.location.href = encodeuri (url);
La URL transcodificada: http://127.0.0.1:8080/perbank/showmoblieqrcode.servlet?name=%E6%88%91%E6%98%afcm
Procesamiento de backend:
Name de cadena = request.getParameter ("nombre"); System.out.println ("Parámetros entrantes de primer plano:" + name); name = new String (name.getBytes ("ISO-8859-1"), "UTF-8"); System.out.println ("Parámetros decodificados:" + nombre);Resultado de salida:
Parámetros entrantes en la recepción: ?????? CM
Después de los parámetros de decodificación: soy CM
Transcodificación secundaria
javascript
var url = '/showMoblieqrcode.servlet?name=i am cm'; window.location.href = encodeuri (encodeuri (url));
URL transcodificada: http://127.0.0.1:8080/perbank/showmoblieqrcode.servlet?name=%25E6%2588%2591%25E6%2598%25Afcm
Procesamiento de backend:
Name de cadena = request.getParameter ("nombre"); System.out.println ("Parámetros entrantes de primer plano:" + nombre); nombre = urlDecoder.Decode (nombre, "UTF-8"); System.out.println ("Parámetros decodificados:" + nombre);Resultado de salida:
Parámetros entrantes frontales: E68891E698AFCM
Después de los parámetros de decodificación: soy CM
filtrar
Usando filtros, Filter LZ proporciona dos tipos, el primero es establecer la codificación, y el segundo es realizar operaciones de decodificación directamente en el filtro.
Filtro 1
Este filtro establece directamente el formato de codificación de la solicitud.
El personaje de la clase pública implementa el filtro {configuración privada FilterConfig; Codificación de cadena = nulo; public void destruye () {config = null; } public void dofilter (ServletRequest Solicitud, Respuesta ServletResponse, FilterChain Chain) lanza ioexception, servletException {request.setcharacterEncoding (codificación); Chain.dofilter (solicitud, respuesta); } public void init (FilterConfig config) lanza ServletException {this.config = config; // Obtener parámetros de configuración String str = config.getInitParameter ("codificación"); if (str! = null) {coding = str; }}} Configuración:
<filter> <filter-name> cheanEncodingFilter-name> <filter-class> com.test.filter.characteriCoDingFilter-class> <Init-param> <amamname> codingparam-name> <amam-value> utf-8param-value> init-param> filtro> <filter-mapping> <filter-name> chinocodingfilterfilterfilterfilter name <URL-Pattern>/*URL-Pattern> Filter-Mapping>
Filtro 2
En el método de procesamiento, el filtro decodifica directamente los parámetros y luego restablece los parámetros decodificados al atributo de solicitud.
El personaje de la clase pública implementa el filtro {FilterConfig FilterConfig de FilterConfig protegido; Codificación de cadena = nulo; public void destruye () {this.filterConfig = null; } / *** Inicializar* / public void init (filterconfig filterconfig) {this.filterconfig = filterconfig; } / *** Convierta Instr en el formulario de codificación de UTF -8** @param Instr Enter String* @return Utf - El formulario de codificación de 8 String* @throws UnspportedEnCodingEntingException* / private String toutf (String Instr) lanza UnspportedEncodingException {String Outstr = ""; "; if (instr! = null) {outstr = new String (instr.getBytes ("ISO-8859-1"), "UTF-8"); } return outstr; } / *** Procesamiento de filtrado de confuso chino* / public void dofilter (ServLetRequest ServLetRequest, ServLetResponse ServLetResponse, FilterChain Chain) lanza IOException, ServletException {httpServletRequest solicitud = (httpServletRequest) ServLetRequest; HttpservletResponse respuesta = (httpservletResponse) servletResponse; // El método para obtener la solicitud (1.post o 2.get), y se realiza un procesamiento diferente de acuerdo con diferentes métodos de solicitud, método de cadena = request.getMethod (); // 1. Para las solicitudes enviadas en la publicación, establezca directamente la codificación en UTF-8 if (Method.equalSignorEcase ("Post")) {try {request.setcharacterEncoding ("utf-8"); } catch (UnsupportedEncodingException e) {E.PrintStackTrace (); }} // 2. Solicitud enviada en Get Else {// Obtenga el conjunto de parámetros enviado por la enumeración del cliente paramNames = request.getParamTernames (); // atraviesa el conjunto de parámetros para obtener el nombre y el valor de cada parámetro mientras (paramnames.hasmoreElements ()) {string name = paramNames.nextElement (); // Eliminar los valores de las cadenas de name de parámetro [] = request.getParametervalues (name); // su valor de acuerdo con el nombre de parámetro // si el valor del parámetro no está vacío si (valores! establecer para (int i = 0; i <value.length; i ++) {try {// círculo hacia atrás y llame a cada método de valor toutf (valores [i]) para convertir la codificación de caracteres de la cadena del valor del parámetro vlustr = toutf (valores [i]); valores [i] = vlustr; } catch (UnsupportedEncodingException e) {E.PrintStackTrace (); }} // Ocultar el valor en forma de un atributo en solicitud Solicitud.SetAttribute (nombre, valores); }}} // Establezca el método de respuesta y admite la respuesta del conjunto de caracteres chino.setContentType ("text/html; charset = utf-8"); // Continuar ejecutando el siguiente filtro. Si no hay filtro, la cadena de solicitud.dofilter (solicitud, respuesta); }}Configuración:
<filter> <filter-name> chinocodingfilter-name> <filter-class> com.test.filter.characteriCodingfilter-class> filtro> <filter-mapping> <filter-name> chinocodingfilter-name> <url-pattern>/*url-patn> mapping de filtro>>
otro
1. Establezca PageCoding y ContentType
<%@ page lenguaje = "java" contentType = "text/html;
charset = UTF-8 "PageEncoding =" UTF-8 "%>
2. Establezca el uriencoding de Tomcat
De manera predeterminada, el servidor TomCat utiliza el formato de codificación ISO-8859-1 para codificar la URL solicitada por el parámetro UriEncoding, por lo que solo necesitamos agregar uriencoding = "UTF-8" a la etiqueta del archivo server.xml de TomCat.
Lo anterior se trata de este artículo. Espero que sea útil para todos aprender preguntas confusas chinas de Java.