Início > Programação > Problema no Encoding de Páginas JSF no Internet Explorer

Problema no Encoding de Páginas JSF no Internet Explorer

Utilizo a implementação do Mojarra do JSF e alguns componentes do Primefaces em meu projeto. Tive problemas com encoding no Internet Explorer (versões 7, 8 e 9). O problema só ocorria ao fazer submit. Com chamadas ajax funcionava normalmente. Fazendo algumas pesquisas fiz descobertas interessantes que vou compartilhar.

O Problema do Encoding

No mundo Java/JSP/Servlet, todo caracter desconhecido passado através do método write() de um OutputStream é impresso como um ponto de interrogação “?”. Um dos casos em que esse caracter é apresentado é quando se tenta utilizar ISO 8859-1 para exibir caracteres Unicode, pois o ISO não cobre todo o charset do Unicode.

JSF/Facelets usa UTF-8 para todas as HTTP requests e responses. É necessário configurar o servidor para utilizar o mesmo encoding. Quando você está utilizando um filtro customizado ou uma biblioteca de terceiros que chama request.getParameter() ou qualquer outro método que implicitamente precisa parsear a request para extrair dados, é provável que o JSF ainda não tenha tido tempo para setar o encoding UTF-8 antes da request ser parseada pela primeira vez.

As presenças do filtro do file uploader do Primefaces e do próprio Primefaces explicam porque esse problema ocorre quando faço o submit da página – pois suponho que aquele filtro e mais algum componente do Primefaces interceptam a request – e não ocorre quando faço chamadas ajax.

Uma Possível Solução

Durante o processamento da request, um servidor de aplicação usará por padrão o encoding ISO 8859-1 para decodificar os parâmetros. É necessário forçar o encoding para UTF-8. No caso de um HTTP GET, basta configurar o encoding desejado em algum arquivo de configuração do servidor. Para o Tomcat, por exemplo:

<Connector (...) URIEncoding="UTF-8" />

No caso do URL-decoding dos parâmetros da request de um POST, é esperado que o navegador envie o charset definido no Content-Type do header da request, mas a maioria dos navegadores não envia. O Internet Explorer envia o encoding definido no atributo accept-charset do HTML form, mas essa implementação não funciona em certas circunstâncias e o encoding setado é perdido na request.

Para resolver esse problema, você pode criar um filtro mapeado em /* para setar programaticamente o encoding UTF-8 na ServletRequest quando o navegador é o Internet Explorer (família MSIE) e quando não há encoding setado:

public class EncodingFilter implements Filter {

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;

		String browser = req.getHeader("USER-AGENT");
		boolean ieBrowser = browser != null
				&& browser.toUpperCase().contains("MSIE");
		boolean hasEncode = req.getCharacterEncoding() != null;

		if (ieBrowser && !hasEncode)
			req.setCharacterEncoding("UTF-8");

		chain.doFilter(req, response);
	}

	@Override
	public void init(FilterConfig arg) throws ServletException {
	}

	@Override
	public void destroy() {
	}
}

Mapeamento do filtro no web.xml:

<filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>
        encoding.filter.EncodingFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Referências

http://balusc.blogspot.com.br/2009/05/unicode-how-to-get-characters-right.html

http://stackoverflow.com/questions/2006826/jsf-form-and-german-umlauts

http://www.irian.at/en/blog/-/blogs/jsf-ajax-and-encoding

http://java.dzone.com/articles/fun-character-encoding-and

Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: