Numa aplicacao web que fiz as vezes e necessario criar documentos CSV com base em alguma entrada do usuario.O problema e que o arquivo gerado ficou grande, entao o download era demorado. Eu queria mostrar uma tela para o usuario dizendo quando o download iniciou e retirar essa tela quando o download terminar.O problema: como detectar quando acabou o download e atualizar isso no navegador?Existem algumas formas de fazer isso, porem eu queria algo simples, rapido que nao fosse necessario escrever arquivo, ou algum mecanismo de cache complicado.Achei essa solucao que acredito que pode ser util pra muita gente.Dependencias:Java Server FacesJqueryJquery cookiesAbaixo, no lado cliente:<h:panelGrid columns="2"> <h:graphicImage value="/pages/img/report.ico" /> <a href="javascript:showDialog('#dialogTerminaisValidados');">lista de terminais ativos</a></h:panelGrid>Agora, o div dialogTerminaisValidados, onde sera exibido uma caixa de dialogo informando o usuario que o download podera demorar alguns minutos e solicitando sua confirmacao de download:<div id="dialogTerminaisValidados" style="display:none; text-align: center;"> <h:form id="frm_terminaisValidados"> <p>Esse processo podera demorar alguns minutos. Tem certeza que deseja continuar?</p> <h:panelGrid columns="2"> <h:commandButton value="Ok" action="#{relatorioBean.geraListaTerminaisValidados}" onclick="load('#dialogTerminaisValidados');" /> <h:commandButton value="voltar" onclick="$('#dialogTerminaisValidados').dialog('close')" /> </h:panelGrid> </h:form></div>O javascript onde trataremos as caixas de dialogo e o processo de download.Na primeira funcao 'load(idHide)' iremos eliminar a caixa de confirmacao de download, onde o usuario confirma e em seguida iremos exibir uma caixa de informacao de processo do download. Essa deve ficar ativa ate a conclusao do download.Logo e chamada a funcao checkDownload(), que vai verificar se existe um cookie chamado 'success', em seguida pegar o seu valor e finalizar a caixa de informacao de processo do download. Observe que enquando nao e finalizado, a funcao fica tentando encontrar o cookie de segundo em segundo.Apos a chegada do cookie, e chamado a funcao finishDownload() que elimina a caixa de dialogo do processo de download e finaliza o processo de procura do cookie e ainda elimina o cookie. Caso haja uma nova solicitacao de download sera gerado um novo cookie no servidor.<script type='text/javascript'> var fileDownloadCheckTimer; function load(idHide){ if (idHide != null) { $(idHide).dialog('close'); $(idHide).hide(); checkDownload(); } $('#wait').show().dialog({ height:80, width: 200, closeOnEscape: false, resizable: false, disabled: true, title: 'Processando...', modal:true }); } function checkDownload() { fileDownloadCheckTimer = window.setInterval(function () { var cookieValue = $.cookies.get('success'); if (cookieValue == 'success') finishDownload(); }, 1000); } function finishDownload() { $('#wait').dialog('close'); $('#wait').hide(); window.clearInterval(fileDownloadCheckTimer); $.cookies.del('success'); } function showDialog(idShow){ $(idShow).show().dialog({ height:130, width: 350, closeOnEscape: false, resizable: false, disabled: true, dialogClass: 'alert', title: 'Atencao!', modal:true }); }</script>No lado servidor adicionaremos o cookie para enviar ao navegadorExternalContext ectx = ctx.getExternalContext();HttpServletResponse resp = (HttpServletResponse) ectx.getResponse();resp.addCookie(new Cookie("success", "success"));Inclui um cookie chamado 'success' que sera enviado ao navegador juntamente com o processo de download concluido.Abaixo deixo o metodo que eu utilizo para processar o download. Eu envio o tipo de arquivo, no meu caso 'text/plain' por que e do tipo 'CSV', o contexto do jsf e o nome do arquivo.public static void downloadFile(String mimeType, FacesContext ctx, String file) { ExternalContext ectx = ctx.getExternalContext(); File f = new File(file); HttpServletResponse resp = (HttpServletResponse) ectx.getResponse(); resp.addCookie(new Cookie("success", "success")); resp.setHeader("Content-Disposition", "attachment;filename=" + file + ""); resp.setContentLength((int) f.length()); resp.setContentType(mimeType); try { FileInputStream in = new FileInputStream(f); OutputStream out = resp.getOutputStream(); byte[] buf = new byte[(int) f.length()]; int count; while