Redirecionamento automático no timeout da sessão (Servlet)

11 respostas
T

Olá pessoal, estou pensando em fazer o redirecionamento automático do usuário quando a sessão expirar, mas não estou conseguindo fazer, será que algum dos caros colegas ja fez isto alguma vez ou teria alguma dica pra dar?

Na realidade essa idéia surgiu por um problema que encontrei utilizando um componente ajax, no caso um combo(select) que atualiza outro combo(select) por ajax, dai quando cai no filtro e a sessão ja esta expirada, ele iria apenas redirecionar para a página de login, mas como a view ja esta renderizada ele não consegue efetuar a ação e o componente que esperava os dados exibe um erro para o usuário.

Dai a idéia do redirecionamento automatico para evitar esse erro.

Estou usando servlet e jsp, tenho um filtro implementado e funcionando que é exatamente o que barra as solicitações quando a sessão expira.

Qualquer ajuda é bem vinda!

Grato a todos!

11 Respostas

V

Pelo que eu entendi ao mudar o item do primeiro combo ele irá atualizar o segundo por ajax certo? Dai… nesse caso… se a sessão expirou ele cai no filter certo??? Dai o fato de cair no filter com a solicitação ajax não redireciona a página???

Ou seja… se vc não estivesse utilizando ajax vc iria ser redirecionado certo???

Cara… não sei se é isso ai (programo pra web a uns 2 meses). Você utiliza algum framework pra ajax?Se não utiliza nenhum framework… Vc já tentou no filtro… se a sessão expirou ao inves de utilizar o sendRedirect… pegar o Writer do response e devolver um javascript de redirecionamento???

A

Não entendí muito bem a questão… porque não utilizar o próprio filtro que checa o estado da sessão para redirecionar a requisição (usando RequestDispatcher, por exemplo) ?

V

É que pelo que eu entendi… e já tive esse problema… não consigo redirecionar a página do cara se a solicitação é em ajax… Utilizando o arquivo js pra criar o XMLHTTPrequest la… O único jeito que consegui foi mandando uma resposta pra página com um javascript pra redirecionar…

Axo que deve ser isso…sei lá

T

Olá viniciusfaleiro, seguem respostas a seus questionamentos:

Correto!

Correto!

Exatamente isso que não acontece, como a view ja esta renderizada e o retorno é apenas um xml para preenchimento do outro combo, não ocorre o redirecionamento e o componente que aguarda os dados gera um erro para o usuário.

Correto, o filtro esta fazendo o redirecionamento corretamente em todos os outros casos, apenas em relação ao ajax que estou tendo este problema.

Utilizo uma biblioteca de componentes chamada DHTMLX, ela é proprietária e pobre de documentação.

Na verdade eu queria avisar ao usuário que a sessão expirou e não gerar o erro pra ele na página. Como funciona isso de devolver javascript de redirecionamento???

Obrigado pela ajuda!

T

Olá asaudate, o filtro funciona normalmente para todos os outros casos, mas quando utilizo uma chamada ajax para preencher qualquer outro componente ele não faz a requisição pois a view ja esta renderizada.

Abaixo coloquei a linha que cai quando a sessão expira.

if ( (objetoSessao == null) ){ request.getRequestDispatcher("/login.jsp").forward(request, response); }
Esse objetoSessao fica dentro da sessão e quando a sessão expira ele se torna null.
Mas o forward não faz o redirecionamento

V

Eu faço assim, coloco este codigo no arquivo web.xml do projeto, passando a pagina a exibir.

<error-page> <exception-type>javax.faces.application.ViewExpiredException</exception-type> <location>/suaPagina.jsf</location> </error-page>

T

Olá vi-gb, mas isso não funcionaria apenas para projetos em jsf?

Estou usando apenas servlet e jsp.

Grato pela ajuda!

V

Verdade, desculpe.
Mas segundo este link parece que da pra usar pra jsp tambem:
http://java.sun.com/developer/EJTechTips/2003/tt0114.html

R

Como a requisição é via AJAX você vai ter que enviar um retorno informando que a sessão expirou e tratar este retorno com javascript.
Este tratamento pode se uma simples mensagem informando que a sessão expirou ou redirecionando para tela de login.
Você poderia criar um filtro para tratar requisições AJAX e outro filtro para requisições “normais” (neste caso o filtro que já existe).

V

Foi o q eu falei… eu devolvo uma função em javascript pra fazer isso… Se vc usa o próprio js pra fazer a requisição vai ter q tratar a resposta caso ela for um script… senão não funciona. Faz assim… vou te passar o meu script… olha ai…

Essa função te dá a capacidade de responder scripts para o ajax

function extraiScript(texto) { //Função para que funcione as tags <script> utilizando o metodo ajax //Powered by LionSoft do Brasil var ini, pos_src, fim, codigo; var objScript = null; ini = texto.indexOf('<script', 0); while (ini!=-1){ objScript = document.createElement("script"); pos_src = texto.indexOf(' src', ini) ini = texto.indexOf('>', ini) + 1; if (pos_src < ini && pos_src >=0) { ini = pos_src + 4; fim = texto.indexOf('.', ini)+4; codigo = texto.substring(ini,fim); codigo = codigo.replace("=","").replace(" ","").replace("\"","").replace("\"","").replace("\'","").replace("\'","").replace(">",""); objScript.src = codigo; } else { fim = texto.indexOf('</script>', ini) codigo = texto.substring(ini,fim); objScript.text = codigo; } document.body.appendChild(objScript); ini = texto.indexOf('<script', fim); objScript = null; } }

E essa é a requisição em si. Veja que dependendo da flag que eu chamar eu escolho para tratar ou não a resposta… No caso ela trata se for um script (vc tem q ativar o flag)

function ajaxFunction(servlet,gets,dest,flag) {
    if(xmlhttp) {
        xmlhttp.open("POST","http://localhost:8080/" + servlet,true); //getname will be the servlet name

        xmlhttp.onreadystatechange = function(){
            if (xmlhttp.readyState == 4) {
                if(xmlhttp.status == 200) {
                    var pagina = unescape(xmlhttp.responseText);
                    
                    document.getElementById(dest).innerHTML=pagina; //Update the HTML Form element

                    if(flag == 1){
                       extraiScript(pagina);
                    }
                }
                else {
                    alert("Error during AJAX call. Please try again:" + xmlhttp.statusText);
                }
            }
        }

        xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
        xmlhttp.setRequestHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        xmlhttp.setRequestHeader("Cache-Control", "post-check=0, pre-check=0");
        xmlhttp.setRequestHeader("Pragma", "no-cache");
        xmlhttp.setRequestHeader("encoding", "ISO-8859-1");

        xmlhttp.send(gets); //Posting txtname to Servlet
    }
T

Olá viniciusfaleiro, obrigado pela ajuda.

Não tenho muita intimidade com javascript, trabalhei mais de ano com jsf com richfaces, e as chamadas ajax dele é um pouco diferente, mais simples digamos.

E por não ter muita intimidade com javascript é que não entendi muito bem onde se encaixariam as funções javascript que vc enviou.

Por enquanto apenas aumentei o timeout pra não ter esse problema, mas quero resolver isso.

Grato pela ajuda de todos!

[]'s

Criado 9 de dezembro de 2009
Ultima resposta 10 de dez. de 2009
Respostas 11
Participantes 5