Servlet: Response

1 resposta
M

No código abaixo, o que acontece é o seguinte:

response.setContentType("application/octet-stream");
response.setContentLength((int) certificado.length());
response.setHeader("Content-Disposition","attachment; filename=\"Certificado.cer\"");
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(certificado));
ServletOutputStream sos = response.getOutputStream();

byte[] buf = new byte[1024];
int count = 0;
while ((count = bis.read(buf)) >= 0) {
    sos.write(buf, 0, count);
}
bis.close();
sos.flush();
sos.close();

Este código está no meu servlet. Ao executar o flush() é aberta uma caixa de diálogo mostrando a opção para o usuário fazer o dowload. Aqui surgem duas dúvidas:

  1. Como faço para que, após o usuário fazer o download do arquivo, eu redirecione-o para outra página (para efetuar uma cobrança, por exemplo). Já tentei response.sendRedirect(“caminho”) e RequestDispatcher (instanciando um objeto e dando um “forward”) mas, em ambos os casos, me foram lançadas Exceções do tipo IlegalStateException ou “Cannot redirect response alredy commited” (ou algo assim). Procurei em vários lugares mas não encontrei uma solução.

  2. Para o mesmo caso, quando a janela de download é aberta, o usuário tem 2 opções: Fazer o download ou não. Em caso negativo, como consigo saber se o usuário cancelou ou não a ação?? Preciso saber disso para não salvar nada no BD.

Obrigado pela ajuda.
Michel

1 Resposta

T

Pela especificação dos Servlets vocô só pode retornar uma resposta uma única vez, portanto qualquer sendRedirect ou RequestDispatcher que você fizer após o flush vai dar erro, por que o flush é considerado um envio de resposta. Remova a linha do flush e tente colocar o RequestDispatcher no final do código para ver se funciona.

Criado 6 de janeiro de 2007
Ultima resposta 9 de jan. de 2007
Respostas 1
Participantes 2