Character encoding Http Request

3 respostas
jayrmotta

Opa, quando eu recebo uma requisição post no meu servlet e tento atribuir os parametros em variaveis, recebo isso:

WARNING: Parameters: Character decoding failed. Parameter skipped. java.io.CharConversionException: isHexDigit at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:87) at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:48) at org.apache.tomcat.util.http.Parameters.urlDecode(Parameters.java:411) at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:393) at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:344) at org.apache.catalina.connector.Request.parseParameters(Request.java:2401) at org.apache.catalina.connector.Request.getParameter(Request.java:1005) at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:353) at br.com.ctbctelecom.provisionamentovoip.servlet.ConnectSBC.doPost(ConnectSBC.java:63) at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) at java.lang.Thread.run(Thread.java:619)

Aqui o código que dispara a exception:

parametro1 = request.getParameter("par1"); parametro2 = request.getParameter("par2");

O problema é que eu não tenho idéia de como setar no contexto da requisição post um tipo de encoding, se soubesse acredito que ja resolveria com isso:

request.setCharacterEncoding("UTF-8");

Grato! ;D

3 Respostas

furutani

Quais os valores que par1 e par2 tem no momento em que é lançado a exceção?

jayrmotta

Cara não tem nada haver com a forma que você ta passando o charset, o negócio é que você deve estar passando um caracter que representa um um simbolo quando encodado, ou parte de um heh.

Ex: %20 é espaço
%25 é %
e etc...

E a chamada do getParameter como podemos ver na stack, em um momento chama um decoder. Logo ele tenta decodar algo que não está encodado, entende?

A solução é encodar apenas o conteúdo de cada parametro, assim:

String conexao = URLEncoder.encode("200.160.146.108:22:20000@omg:omg:aff%"); //viu o porcento? 
		       String xml = URLEncoder.encode(this.readCfg(inFile);
		       String expect = URLEncoder.encode("10.11.66.17:commands.txt:sbc-M-BHE.txt:trace.txt:1");

		       String data = "par1=" + conexao + "&par2=" + xml + "&par3=" + expect;

		        URLConnection conn = url.openConnection();

Esta é a maneira correta, pois o servlet irá chamar o decoder implicitamente ao tentar obter os parametros.

Abraços!

jayrmotta

Putz cara, você é genial … valeu :stuck_out_tongue:

Criado 21 de julho de 2009
Ultima resposta 21 de jul. de 2009
Respostas 3
Participantes 2