Minha abordagem pessoal seria não para usar a sessão em todos os lugares. Eu tentaria reduzir seu uso na camada do controlador. No controlador, eu extraí o que preciso para minha lógica de negócios e, posteriormente, nunca saberei que há uma sessão da Web envolvida. Isso fará com que a lógica seja portável para aplicativos não-web e funcionará com todos os seus dados de uma maneira segura para o tipo, livre de código clichê.
Se você quiser evitar o código clichê de obter a solicitação, a sessão e, em seguida, os itens da sessão, sua abordagem de método é suficiente, e uma prática comum na minha experiência. Se você estiver usando em Java, você pode melhorar um pouco adicionando alguns genéricos:
public static <T> T getSessionValue(final String key) {
ServletRequestAttributes reqAttr = (ServletRequestAttributes) RequestContextHolder
.currentRequestAttributes();
return (T) reqAttr.getRequest().getAttribute(key);
}
Você pode usá-lo agora assim:
Integer someSessionInt = SessionUtils.<Integer>getSessionValue("someSessionIntKey");
Estou supondo que o método esteja definido em uma classe estática SessionUtils
. Se você defini-lo em uma classe de controlador base, quer usar isso de dentro de um controlador, você deve chamá-lo desta maneira:
Integer someSessionInt = this.<Integer>getSessionValue("someSessionIntKey");
A palavra-chave this
pode ser substituída por super
, mas sem ela um erro de compilação pode ocorrer devido aos genéricos.
Além da minha sugestão acima, há outra maneira de ocultar o uso da sessão e ter uma fachada / API livre de sessão e independente. Ao aderir ao paradigma programação-para-interfaces, você pode ter implementações de interface que usam a sessão, mas isso nunca é mostrado pelas interfaces que você impõe em sua fachada / api. Assim, por exemplo, você pode ter um serviço de autorização de uso geral, exposto através da interface, que mostra quem é o usuário atualmente logado, se ele é um convidado e se tem uma permissão específica. Seu aplicativo pode usar uma implementação concreta da interface de serviço que obtém o usuário da sessão. Quando você usa o serviço, a interface não expõe nada relacionado à sessão, portanto, todos os usos permanecem agnósticos e digitam com segurança.