Sessão expirada e Ajax

247 views
Skip to first unread message

Andrey Farias de Araújo

unread,
May 9, 2011, 6:15:44 PM5/9/11
to caelum-vraptor
Pessoal, estou precisando de uma luz de vocês para resolver o seguinte
problema:

Tenho uma aplicação que está rodando o seguinte comando ajax:

No controller:
result.use(Results.json()).from(pessoaList).include("nascimento").include("cidade").include("emprego").serialize();


No jsp:
$.ajax({
url: $(this).attr('action'),
data: $(this).serialize(),
dataType: 'json',
success: function(json) { ... }


E o interceptor:
public void intercept(InterceptorStack stack, ResourceMethod method,
Object resourceInstance) throws InterceptionException {
if (usuarioSessao.getUsuario() == null){
result.redirectTo(UsuarioController.class).inicio();
} else { stack.next(method, resourceInstance); }
}

Está tudo funcionando ok, sendo que tenho um interceptor, que verifica
se o usuário está logado. Caso não esteja, redireciona para a tela de
login, tudo muito bem simples.

Sendo que esse interceptor só funciona em requisições HTTP. Caso tenha
passado 20 minutos e a sessão tenha expirado, simplesmente o comando
Ajax retorna um erro 404.

A pergunta é:
O que eu poderia fazer neste jsp ou colocar no javascript para
verificar isso antes de tentar realizar o ajax?!

Guilherme Silveira

unread,
May 9, 2011, 6:24:42 PM5/9/11
to caelum-...@googlegroups.com

A unica maneira cem por cento garantida eh colocar o ajax.
Voce pode colocar um js que faz timeout de x minutos e entao seta o ajax.before global para avisar que vc deslogou. E a cada ajax resultado ele posterga o timeout. Mas isso nao garante pois o user pode ter aberto outra aba. Ou qualquer outra coisa.

O melhor eh tratar o erro de nao logado com o codiggo http correspondente e setar a funcao complete do jquery para trata la.

Abraco!

Guilherme Silveira


--
You received this message because you are subscribed to the Google Groups "caelum-vraptor" group.
To post to this group, send email to caelum-...@googlegroups.com.
To unsubscribe from this group, send email to caelum-vrapto...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/caelum-vraptor?hl=en.

Washington Botelho

unread,
May 9, 2011, 8:59:41 PM5/9/11
to caelum-...@googlegroups.com
Oi Andrey,

Você pode verificar no seu interceptor se a requisição é ajax e então caso o usuário esteja deslogado você lança um HTTP 401.
Depois é só tratar esse erro no seu $.ajax().


--
Washington Botelho

http://wbotelhos.com.br
http://twitter.com/wbotelhos


2011/5/9 Andrey Farias de Araújo <and...@catta.com.br>

Andrey Farias de Araújo

unread,
May 9, 2011, 11:38:01 PM5/9/11
to caelum-vraptor
Washington, Guilherme, muito obrigado pela força.

Pesquisando um pouco mais sobre esses códigos HTTPs como vocês me
falaram, encontrei uma coisa que talvez seja nova para vocês, pois se
trata de um recurso que talvez seja novo. É o "statusCode", adicionado
na versão 1.5 do jQuery.

Com ele, resolvi meu problema com muita facilidade, simplesmente
adicionei esta opção na minha requisição. Ficou algo mais ou menos
assim:

$.ajax({
statusCode: {
400: function() {window.location.replace("url-de-
redirecionamento");}
}
});

Aí, caso alguém esteja enrolado que nem eu ou precise de algo do tipo,
já tá a dica aí :)
Vou pesquisar um pouco mais sobre como detectar qual tipo de
requisição estou recebendo no interceptor, caso seja necessário fazer
isso que você citou, Washington.

Muito obrigado!

On 9 maio, 21:59, Washington Botelho <wbotel...@gmail.com> wrote:
> Oi Andrey,
>
> Você pode verificar no seu interceptor se a requisição é ajax e então caso o
> usuário esteja deslogado você lança um HTTP 401.
> Depois é só tratar esse erro no seu $.ajax().
>
> --
> Washington Botelhohttp://wbotelhos.com.brhttp://twitter.com/wbotelhos

Lucas Cavalcanti

unread,
May 9, 2011, 11:41:26 PM5/9/11
to caelum-...@googlegroups.com
não conhecia o statusCode do ajax, valeu pela dica!

2011/5/10 Andrey Farias de Araújo <and...@catta.com.br>

Washington Botelho

unread,
May 10, 2011, 8:58:02 AM5/10/11
to caelum-...@googlegroups.com
Então Andrey,

A idéia é exatamente essa. E de fato, o statusCode ajuda, já que o VRaptor deixa você setar a resposta assim:

result.use(http()).setStatusCode(200); ou
result.use(http()).sendError(500, e.getMessage());

Não esqueça de utilizar os callbacks error, success e o complete que sempre executa dando erro ou não.

Boa sorte ai. (:
2011/5/10 Andrey Farias de Araújo <and...@catta.com.br>
Reply all
Reply to author
Forward
0 new messages