Como definir a codificação de solicitação no Tomcat?

Eu tenho um problema no meu webapp Java.

Aqui está o código em index.jsp:

      JSP Page   

Hello World!

Res:

Quando eu procuro um pedido, meu navegador envia este header:

 GET /kjd/index.jsp?q=%C3%A9 HTTP/1.1\r\n ... Accept-Charset: UTF-8,*\r\n 

E o servidor Tomcat me retorna isso:

 Content-Type: text/html;charset=UTF-8\r\n 

Mas se eu enviar “é” (% C3% A9 em UTF-8) no meu formulário, “é exibido” em seu lugar.

O que eu entendo é que o navegador envia um “é” codificado com UTF-8 (o% C3% A9).

Mas o servidor interpreta isso como ISO-8859-1. Assim, o% C3 é decodificado como Ãe% A9 como © e, em seguida, envia de volta a resposta codificada em UTF-8.

No código, as solicitações devem ser decodificadas com UTF-8:

 request.setCharacterEncoding("UTF-8"); 

Mas, se eu enviar este URL:

 http://localhost:8080/kjd/index.jsp?q=%E9 

o “% E9” é decoculado com ISO-8859-1 e um “é” é exibido.

Por que isso não está funcionando? Por que as solicitações são decodificadas com o ISO-8859-1?

Eu tentei no Tomcat 6 e 7, e no Windows e Ubuntu.

O request.setCharacterEncoding("UTF-8"); define apenas a codificação do corpo da solicitação (que é usado pelas solicitações POST), não a codificação da solicitação URI (que é usada pelas solicitações GET).

Você precisa definir o atributo URIEncoding como UTF-8 no elemento do /conf/server.xml do Tomcat para que o Tomcat analise o URI da solicitação (e a string de consulta) como UTF-8. Isso, na verdade, é padronizado para ISO-8859-1. Veja também a documentação do conector HTTP do Tomcat .

  

ou para garantir que o URI seja analisado usando a mesma codificação do corpo:

  

Veja também:

  • Unicode – Como obter os caracteres certos? – Pedido JSP / Servlet

Por favor, se livrar desses scriptlets no seu JSP. O request.setCharacterEncoding("UTF-8"); é chamado no momento errado. Seria tarde demais sempre que você tiver usado adequadamente um Servlet para processar a solicitação. Você prefere usar um filtro para isso. O response.setCharacterEncoding("UTF-8"); parte já está implicitamente feita por pageEncoding="UTF-8" na parte superior do JSP.

Também recomendo vivamente que substitua o antigo scriptlet <%= request.getParameter("q") %> por EL ${param.q} , ou com XML JSTL que escape ${fn:escapeXml(param.q)} para evitar Ataques XSS .

você só precisa descomentar a parte inferior do código em conf / web.xml (servidor web Tomcat.xml) que filtra todas as solicitações e as converte em UTF-8.

     setCharacterEncodingFilter org.apache.catalina.filters.SetCharacterEncodingFilter  encoding UTF-8     setCharacterEncodingFilter /*  

é isso aí. funciona bem no tomcat