Arquivo

Posts Tagged ‘internet explorer’

Como Visualizar Certificados Digitais no Windows

No Windows, os certificados digitais ficam no repositório da CAPI. Para acessar esse repositório, basta digitar certmgr.msc no menu Iniciar e teclar [Enter] conforme explicado nesse pequeno tutorial.

Os certificados exibidos no Chrome ou no Internet Explorer ficam armazenados no repositório central do Windows, mas o Firefox tem um repositório próprio. Para interagir com ele, dê uma olhada nesse artigo que escrevi a algum tempo.

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