Pergunta

Eu tenho um projeto para a escola e tenho que usar o Java. Recentemente, encontrei a estrutura do jogo e quero tentar usá -lo. É fácil o suficiente para um início rápido, mas tive um problema com a sessão.

Por ser apátrida por sua natureza, o Play envia uma sessão inteira para o usuário em cookie e a recebe na próxima solicitação, por isso permite uma quantidade limitada de dados em sessão.

O que eu quero fazer é buscar o objeto de usuário do banco de dados no login de usuários e mantê -lo em sessão, para que eu possa acessá -lo a partir de modelos e assim por diante (tenho alguns métodos na classe de usuário que preciso ligar para personalizar a interface do usuário ), mas se eu colocar o objeto do usuário, a reprodução chama seu método de toques e coloque isso em sessão.

Descobri que a maneira recomendada é colocar uma quantidade maior de dados em cache, mas não sei como acessá -los do modelo (acho que poderia fazer um método com @Before Anotation e adicionar usuário ao renderargs, mas isso não parece muito limpo para mim). Outro problema é que o cache tem vida útil limitada, para que meu objeto possa desaparecer.

Alguém tem experiência com esse tipo de problema?

Existe alguma maneira de usar a sessão lateral do servidor com a reprodução? Não preciso de funcionalidade de descanso para este projeto, então, no que me diz respeito, a aplicação pode salvar o estado ...

Foi útil?

Solução

Use a serialização do Java para serializar um hashmap em um arquivo ou no banco de dados. Nomeie o arquivo ou a coluna de identificação após um identificador exclusivo que você armazena no cookie do usuário. Em seguida, coloque o objeto do usuário no hashmap antes de serializar o hashmap. Agora você tem uma loja persistente que pode acessar. Quando a estrutura esquece o objeto do usuário ou qualquer outra informação da sessão, você pode desfazer o hashmap. Em seguida, escreva alguns métodos auxiliares estáticos, objeto estático sessiondb.get (string id, chave de string) e sessiondb.put (string ID, tecla string, valor do objeto). Eu uso esse método na minha estrutura caseira para armazenar informações de sessão em um pequeno farm de servidores. É claro que uso o banco de dados, não um sistema de arquivos.

Outras dicas

Outra opção é converter seus objetos em JSON. Criei um utilitário simples para isso e usei o Flexjson para serializar meus objetos no JSON.

import play.Logger;
import play.mvc.Http;
import play.mvc.Http.Session;
import flexjson.JSONDeserializer;
import flexjson.JSONSerializer;

public class SessionManager {

private static JSONSerializer s = new JSONSerializer();

    public static void addSession(String key, Object value) {

        if(value != null) {
            Session session = Http.Context.current().session();
            session.put(key, s.deepSerialize(value));
        } else {
            Logger.info("Value for " + key + " is null");
        }
    }

    public static <T> T get(String key) {

        Session session = Http.Context.current().session();
        final String value = session.get(key);

        if (value == null) {
            return null;
        }

        return new JSONDeserializer<T>().deserialize(value);
    }

}

Nota: você terá que gerenciar a limpeza após o seu trabalho e lembre -se de que, como isso é armazenado no cookie, não é tão seguro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top