Práticas recomendadas para usar sessões HTTP (Java)

5

Minha pergunta não é sobre como usar a sessão HTTP ou como os valores estão sendo usados na sessão. A pergunta é mais orientada sobre a abordagem.

No meu aplicativo atual há poucos valores sendo armazenados na Sessão e exigimos esses valores a cada momento e, aqui estão alguns valores que buscamos da sessão

  1. Armazenar
  2. Idioma
  3. Cliente
  4. poucas outras

Eu posso buscar esses valores da sessão como

request.getSession().getAttribute( "name" )

Eu preciso desses valores não diretamente no meu controlador, mas em outra camada (por exemplo, Fachada), então eu tenho duas opções

  1. Transmita os valores necessários para o método Facade em request.getSession().getAttribute( "name" ) .
  2. Crie um método em cada classe de fachada como.

Método na fachada

 private Object getSessionValue(final String key) {
    ServletRequestAttributes reqAttr = (ServletRequestAttributes) RequestContextHolder
                            .currentRequestAttributes();
            return reqAttr.getRequest().getAttribute(key);
}

Apesar de ambos estarem funcionando no meu caso, mas com uma exceção, eu preciso ter esse método em cada Classe de Fachada ou precisar buscar cada objeto no Controller.

Existe alguma outra maneira ou abordagem que pode ser mais limpa ou minha abordagem atual é boa

    
por Umesh Awasthi 29.11.2013 / 08:21
fonte

1 resposta

3

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.

    
por 29.11.2013 / 11:07
fonte