Realmente isso é uma coisa que o pessoal costuma abusar demais.
Tem alguns projetos em que todos os dados que se utiliza (resultado de consultas) são colocados na Sessão, mesmo que seja só para mostrar nessa tela mesmo.
Outros usam a sessão como um serviço de cache para evitar acesso ao banco de dados, e aí cada usuário logado tem em sua sessão uma cópia de algumas das tabelas de acesso mais frequente.
E por aí vai…
Na minha opinião, o que é válido colocar na Sessão:
-> Informações que efetivamente estão atreladas à Sessão de utilização. Isso significa: dados do usuário corrente e seus acessos.
-> Dados de transações que o usuário precisa ir avançando por várias telas para concluir. Nesse caso, ficar ligado na limpeza! Chame a limpeza da sessão em todos os pontos possível, no botão Ok, no Cancelar, nos cliques do menu…
-> Esse item aqui já não é tão correto, mas é um pecado que eu também cometo: usar lista na sessão para consultas paginadas. O ideal é fazer a consulta paginada de verdade, ou seja, tratar na consulta ao banco, só que os componentes de tabela (displaytag, datatable, etc) acabam obrigando a fornecer a lista inteira.
-> Só quando não tiver jeito mesmo: quando precisar fazer um Redirect e na volta mostrar uma determinada informação, pode usar a sessão para fazer aquele “ei, segura aí pra mim que eu já volto”. Limpe o dado da sessão assim que usá-lo no próximo request.
E veja que desses itens apenas o primeiro é realmente coisa para guardar na Sessão!
O segundo, o terceiro e o quarto são workarounds para simular escopos mais interessantes, como Conversation, View ou Flash. Em frameworks mais modernos alguns desses usos podem ser eliminados.
Agora só de curiosidade: esse cara escreveu um post sobre como eliminar completamente da sua vida a HTTPSession:
http://www.objectzilla.com.br/2010/06/05/o-uso-de-sessao-em-aplicacoes-web/
Eu sinceramente não consigo, e vocês ? 