Enviamos principalmente solicitações ao servidor através de duas formas de envio: URL e formulário. A forma de forma geralmente não tem problemas ilegíveis, e os problemas ilegíveis estão principalmente no URL. Através da introdução dos blogs anteriores, sabemos que o processo de envio de solicitações de codificação para o servidor por URL é realmente muito confuso. Sistemas operacionais diferentes, diferentes navegadores e diferentes conjuntos de personagens da Web levarão a resultados de codificação completamente diferentes. Não é muito assustador se os programadores desejam levar em consideração todos os resultados? Existe uma maneira de garantir que o cliente use apenas um método de codificação para emitir uma solicitação ao servidor?
ter! Aqui eu forneço principalmente os seguintes métodos
1. JavaScript
O uso da codificação JavaScript não dá ao navegador a chance de intervir. Após a codificação, envie uma solicitação para o servidor e decodificá -la no servidor. Ao dominar esse método, precisamos de três métodos de codificação JavaScript: Escape (), Encodeuri () e EncodEuricomponent ().
escapar
A sequência especificada é codificada usando o conjunto de caracteres latinos SIO. Todos os caracteres não-ASCII são codificados como strings no formato %xx, onde xx representa o número hexadecimal correspondente ao caractere no conjunto de caracteres. Por exemplo, a codificação correspondente ao formato é %20. Seu método de decodificação correspondente é UNESCAPE ().
De fato, Escape () não pode ser usado diretamente para a codificação de URL, sua função real é retornar o valor codificado por unicode de um caractere. Por exemplo, o resultado de "eu sou CM" acima é %U6211 %U662FCM, onde a codificação correspondente de "I" é 6211, a codificação de "Sim" é 662F e a codificação de "CM" é CM.
Observe que o Escape () não está correto para a codificação "+". Mas sabemos que, se houver espaços na página da web ao enviar o formulário, ele será convertido em caracteres +. Quando o servidor processa dados, o sinal + será processado em espaços. Portanto, tenha cuidado ao usá -lo.
Encodeuri
Codendo todo o URL, ele usa o formato UTF-8 para emitir a sequência codificada. No entanto, o Encodeuri não codificará alguns caracteres especiais, exceto a codificação ASCII, como :! @ # $ & * () =: /; ? + '.
codeuricomponent ()
Converta seqüências de URI em seqüências de escape no formato de codificação UTF-8. Comparado ao EncodEuri, o Encodeuricomponent será mais poderoso e será codificado para símbolos (; / ?: @ & = + $, #) que não são codificados em codeuri (). No entanto, o codeuricomponent codificará apenas os componentes do URL individualmente e não será usado para codificar todo o URL. O método de função decodificadora correspondente decodEuricomponent.
Obviamente, geralmente usamos a parte Encodeuri para executar operações de codificação. O chamado JavaScript codificando e decodificando duas vezes em segundo plano é usar esse método. Existem duas soluções para resolver esse problema no JavaScript: uma transcodificação e dois métodos de transcodificação.
Transcodificação uma vez
JavaScript Transcoding:
var url = '/showmoblieqrcode.servlet?name=i am cm'; window.location.href = codeuri (url);
O URL transcodificado: http://127.0.0.1:8080/perbank/showmoblieqrcode.servlet?name=%E6%88%91%E6%98%AFCM
Processamento de back -end:
Nome da string = request.getParameter ("nome"); System.out.println ("Parâmetros de entrada em primeiro plano:" + nome); nome = new String (name.getBytes ("ISO-8859-1"), "UTF-8"); System.out.println ("Parâmetros decodificados:" + nome);Resultado da saída:
Parâmetros de entrada na recepção: ????? cm
Após a decodificação dos parâmetros: eu sou CM
Transcodificação secundária
JavaScript
var url = '/showmoblieqrcode.servlet?name=i am cm'; window.location.href = codeuri (codeuri (url));
URL transcodificado: http://127.0.0.1:8080/perbank/showmoblieqrcode.servlet?name=%25e6%2588%2591%25e6%2598%25afcm
Processamento de back -end:
Nome da string = request.getParameter ("nome"); System.out.println ("Parâmetros de entrada em primeiro plano:" + nome); nome = urldecoder.Decode (nome, "utf-8"); System.out.println ("Parâmetros decodificados:" + nome);Resultado da saída:
Parâmetros de entrada do front-end: E68891E698AFCM
Após a decodificação dos parâmetros: eu sou CM
filtro
Usando filtros, o filtro LZ fornece dois tipos, o primeiro é definir a codificação e o segundo é executar operações de decodificação diretamente no filtro.
Filtro 1
Este filtro define diretamente o formato de codificação da solicitação.
classe pública CaracterEncoding implementa filtro {private filterConfig config; String codinging = null; public void Destroy () {config = null; } public void Dofilter (Solicitação de servletRequest, resposta servletResponse, cadeia de filtro) lança IoException, servletexception {request.SetcharAcTerEncoding (codificação); Chain.Dofilter (solicitação, resposta); } public void init (filterConfig config) lança servletexception {this.config = config; // Obter parâmetros de configuração String str = config.getInitParameter ("Encoding"); if (str! = null) {coding = str; }}} Configuração:
<filter> <filter-name> chinês-codingfilter-name> <filter-class-class> com.test.filter.characterencodingfilter-class-class> <iit-param> <amam-name> codingparam-name> <mult-value> utf-8param-value> init-pairam> filtername> <filter-mapping> <name> <url-padrão>/*url-padrão> mapeamento de filtro>
Filtro 2
No método de processamento, o filtro decodifica diretamente os parâmetros e depois redefine os parâmetros decodificados para o atributo de solicitação.
classe pública Caracterencoding implementa filtro {Protected filterConfig filterConfig; String codinging = null; public void Destroy () {this.FilterConfig = null; } / *** inicialize* / public void init (filtroConfig filterConfig) {this.FilterConfig = filterConfig; } / *** Converta Instr no formulário de codificação do UTF -8** @param Instr Enter String* @RETURN UTF - 8 de codificação de 8 String* @Throws UnsupportEdEnCodingException* / String private Toutf (String Instr) lança UnsupportEnCodingException {String Outstr = "";; if (Instr! = NULL) {Outstr = new String (Instr.GetBytes ("ISO-8859-1"), "UTF-8"); } return fortr; } / *** Processamento de filtragem iluminado chinês* / Public void Dofilter (servletRequest servletRequest, servletResponse servletResponse, cadeia de filtro) lança IoException, servletexception {httpservleTleQuest request = (httpSleTleTequest) servleTreleTrequest; HttpServLeTResponse Response = (httpServletResponse) servletResponse; // O método para obter a solicitação (1.Post ou 2.GeT) e processamento diferente é executado de acordo com diferentes métodos de solicitação String Method = request.getMethod (); // 1. Para solicitações enviadas no post, defina diretamente a codificação como utf-8 if (method.equalsignorecase ("post")) {try {request.Setcharacterencoding ("utf-8"); } Catch (UnsupportEdEncodingException e) {E.PrintStackTrace (); }} // 2. Solicitação enviada no get else {// retire o parâmetro definido enviado pelo cliente de enumeração paramnames = request.getParameterNames (); / Traverse o parâmetro definido para obter o nome e o valor de cada parâmetro while (paramnames.hasmoreElements ()) {string name = paramnames.nextElement (); // retire o nome do parâmetro string valores [] = se request.getParameTervAds (nome); definido para (int i = 0; i <valores.length; i ++) {try {// circule de volta e chama cada método Toutf (valores [i]) para converter a codificação do caractere da string de valor do parâmetro vlust = toutf (valores [i]); valores [i] = vluste; } Catch (UnsupportEdEncodingException e) {E.PrintStackTrace (); }} // Ocultar o valor na forma de um atributo no request request.setAttribute (nome, valores); }}} // Defina o método de resposta e suporta o conjunto de caracteres chinês. // continua a executar o próximo filtro. Se não houver filtro, a cadeia de solicitações.Dofilter (solicitação, resposta); }}Configuração:
<filter> <filter-name> chinêsncodingfilter-name> <filter-class> com.test.filter.characterencodingfilter-class> filtro> <filter-mapping> <filter-name> chinesencodingfilter-name> <url-pattern>/*url-pattern> mapeamento de filtro>
outro
1. Defina a PageNencoding e o ContentType
<%@ página de página = "java" contentType = "text/html;
charset = utf-8 "PageEncoding =" UTF-8 "%>
2. Configure o urincoding de Tomcat
Por padrão, o servidor TomCat usa o formato de codificação ISO-8859-1 para codificar o URL solicitado pelo parâmetro URIENCODING, por isso precisamos adicionar apenas o URIENCODING = "UTF-8" à tag do arquivo server.xml do tomcat.
O acima é tudo sobre este artigo. Espero que seja útil que todos aprendam perguntas chinesas de Java.