Controle Sessao - Carrinho de Compras

3 respostas
J

Ola…

Estou montando um site e tenho problemas com o controle de sessao num carrinho de compras, vou explicar o meu cenario:

1) Qdo faço o login, crio a sessao do usuario e atribuo varios objetos de controle nesta sessao.
2) Nas proximas paginas eu busco da sessao estes objetos, porem se essa sessao existe esta tudo OK.

Meu problema e:
Se a sessao do usuario expirou e vou utilizar o objeto q estaria, recebo um nullpointer. Para evitar isso, averiguo se o objeto retornado esta null, ai redireciono para um novo login. Mesmo se faço um request.getSession(true), vou ter uma nova sessao, porem sem meu objetos criados inicialmente.

Porém esta checagem teria q fazer em todas as paginas q vou utilizar a sessao. Existe alguma forma mais facil para evitar fazer tantas vezes essa checagems? Tipo criar um Filter que valide antes de permitir o request chegar no codigo que consulta os objetos da sessao…

O que vcs me sugerem?

Obrigado. :slight_smile:

abrs

3 Respostas

L

Vamos por partes:

  1. Por que carrinho de compras está na sessão? Carrinho de compras se tornou o “The book is on the table” no aprendizado web, e todo mundo mundo ensina que carrinho de compras é um objeto de sessão. Mas será que é verdade? Veja: na Amazon, mesmo acessando meu login meses depois de uma compra não-efetuada, aparece lá depois de muita navegação, os livros que eu quase comprei. Eles estão armazenando carrinho de compras no banco de dados, não na sessão! Não digo que você deve fazer isso, mas é uma possibilidade.

  2. Me deu um frio na espinha quando você disse “objetos de controle”, e ainda por cima “vários”. Bom, um site web com boa acessibilidade possuem poucos objetos em sessão. Os usuários não irão seguir exatamente o fluxo de navegação pensados pelos desenvolvedores, pois aqueles irão salvar no favoritos, desligar a máquina, apertar o botão voltar… A sessão irá sumir sobre essas várias possibilidades, e você não deveria considerar a sessão como algo sempre presente. Pode haver um erro de arquitetura sério no seu sistema.

No caso de login expirado, é meio simples, faça um Filter. O algoritmo que eu sugiro é este:

  • O filtro verifica as credenciais (não encontra).
  • Pega a URL atual, e coloca como parâmetro na url da página de login (redirect, não forward).

No redirect:

  • A url como parâmetro é também apresentado como hidden field do form.

Próxima requisição:

  • O usuário manda o login e a senha. E sem preceber também, a url onde estava num hidden.
  • Se o login estiver correto, você redireciona para o url recebida. O usuário volta para a mesma página onde esteve.

Isso só funciona, claro, se você baseou sua aplicação web em requests, não em sessions.

M

Como o colega mencionou…

Se utilizado JavaServer Faces você pode fazer um classe que auxilie isso ae, usando as fases do Faces. Toda vez antes da requisição vc valida o acesso e na hora da renderização também. Se o usuário nao estiver logado e seja necessário o login, armazene a pagina requisitada e redirecione-o para a página de login, feito isso quando entrar com os dados corretamente, retorne-o para a pagina que ele queria acessar.

J

Obrigado pela ajuda Leonardo3001.

:slight_smile: Vou tentar reformular melhor o site!

abrs

Criado 8 de janeiro de 2009
Ultima resposta 8 de jan. de 2009
Respostas 3
Participantes 3