300 likes | 389 Views
Java avançado. Sessão - Contextualização. Muitas aplicações se faz necessário o acompanhamento da navegação do usuário armazenando informações específicas de cada um.
E N D
Sessão - Contextualização • Muitas aplicações se faz necessário o acompanhamento da navegação do usuário armazenando informações específicas de cada um. • É comum hoje em dia acessarmos algum site que peça para fazermos nosso login para podermos ter acesso a funcionalidades da aplicação. Esse processo também é conhecido como autenticação. • Mas, como o site sabe, nas requisições seguintes que fazemos, quem somos nós?
Sessão – Protocolo HTTP • O protocolo HTTP utilizado até agora para o acesso à páginas é limitado por não manter detalhes como quem é quem entre uma conexão e outra. • Para resolver isso, foi inventado um sistema para facilitar a vida dos programadores através do cookie.
Cookie - Conceitualização • Um cookie nada mais é que um pedaço de informação que é enviado do servidor para o navegador. • Um cookie é normalmente um par de strings guardado no cliente, seguido de propriedade e valor. • Quando um cookie é salvo no cliente, ele é enviado de volta ao servidor toda vez que o cliente efetuar uma nova requisição. • Desta forma, o servidor consegue identificar aquele cliente sempre com os dados que o cookie enviar.
Cookie • Usar Cookies parece facilitar muito a vida, mas através de um cookie não é possível marcar um cliente com um objeto, somente com Strings. • Imagine gravar os dados do usuário logado através de cookies. • Seria necessário um cookie para cada atributo: usuario, senha, id, data de inscrição, etc. Sem contar a falta de segurança.
Cookie - Limitação • O Cookie também pode estar desabilitado no cliente, sendo que não será possível lembrar nada que o usuário fez.... • Eis que surge a sessão.
Sessão • A sessão nada mais é que um tempo que o usuário permanece ativo no sistema. • A cada página visitada, o tempo de sessão é zerado. • Quando o tempo ultrapassa um limite demarcado no arquivo web.xml, o cliente perde sua sessão • Uma sessão facilita a vida de todos por permitir atrelar objetos de qualquer tipo a um cliente, não sendo limitada somente à strings e é independente de cliente.
Sessão – Tipos de controle • Uma sessão pode ser gerenciada de duas formas: • Gerenciada por cookie • Se os cookies estiverem desabilitados, a sessão não funcionará e devemos recorrer para uma técnica (trabalhosa) chamada url-rewriting.
Sessão – Timeout padrão • Por padrão o arquivo web.xml já possui um tempo definido para sessão, como pode ser visto abaixo. <session-config> <session-timeout> 30 </session-timeout> </session-config>
Sessão – Configurar tempo • Para configurar 3 minutos como o padrão de tempo para o usuário perder a sessão basta incluir o seguinte código no arquivo web.xml: <session-config> <session-timeout> 3 </session-timeout> </session-config>
Sessão gerenciada por cookie • Quando estamos trabalhando com sessão gerenciada por cookie temos que simplesmente nos preocupar com em obter o objeto que representa a sessão, e a manipulação do cookie é feita pelo container. • Mas, CUIDADO. • Se o cookie estiver desabilitado no browse, teremos problemas.
Sessão – Obtendo HttpSession • Para obtermos o objeto sessão em um servlet utilizaremos o método getSession() do objeto request. • HttpSessionsession = request.getSession( ); • Retorna um objeto sessão caso exista, caso contrário, crie um novo e retorne-o. • HttpSessionsession = request.getSession( true/false ); • True • Retorna um objeto sessão caso exista, caso contrário, crie um novo (mesmo que request.getSession( ) ). • False • Retorna um objeto sessão caso exista, caso contrário retorne null.
Sessão – Interface HttpSession • Nós desenvolvedores quando trabalhamos com Sessão, só precisamos nos preocupar em usar a classe HttpSession, o restante o container se encarrega de fazer para gente. • HttpSession permite a manipulação dos elementos de uma sessão. API HttpSession
Sessão – Interface HttpSession • publiclonggetCreationTime() • Para saber qual dia/horário foi criada a sessão. • publicjava.lang.String getId() • Retorna um objeto String que identifica a sessão. • publiclonggetLastAccessedTime() • Para saber o dia/horário da ultima requisição feita naquela sessão. Date acess = new Date(session.getCreationTime()); Formatformatter = newSimpleDateFormat("MM/dd/yy"); System.out.print( formatter.format(acess) );
Sessão – Interface HttpSession • publicvoidsetMaxInactiveInterval(intinterval) • Seta para essa sessão o tempo máximo de inatividade permitido, ou seja, o timeout. • Atenção que aqui não é para todas as sessões, e sim para a sessão corrente. • publicintgetMaxInactiveInterval() • Retorna o tempo de limite definido para a sessão. • publicjava.lang.ObjectgetAttribute(java.lang.String name) • Retorna um determinado objeto colocado na sessão, ou null caso não exista. • Observe que o retorno é um objeto “Object”, portanto faz se necessário um ‘cast’
Sessão – Interface HttpSession • publicjava.util.EnumerationgetAttributeNames() • Retorna um Objeto Enumeration contendo todos os nomes dos atributos colocados na sessão. • publicvoidsetAttribute(java.lang.String name,java.lang.Objectvalue) • Coloca algum objeto na sessão. Enumeration elements = session.getAttributeNames(); while( elements.hasMoreElements() ){ System.out.print( elements.nextElement() ); }
Sessão – Interface HttpSession • publicvoidremoveAttribute(java.lang.String name) • Remove um objeto que foi armazenado na sessão. • publicvoidinvalidate() • Método para terminar a sessão, basicamente retira todos os objetos da sessão corrente. • Ele é chamado ou programaticamente, ou pelo próprio container quando a sessão expira. • publicbooleanisNew() • Retorna true se o clienteaindanão tem o conhecimentodasessão.
Exemplo - manipulação na sessão ... UsuarioDaouserDao = newUsuarioDao(); UsuariouserBD = userDao.getUser(user); if( ( userBD != null) && (userBD.getSenha().equals(password) )){ HttpSessionsession = request.getSession( true ); session.setAttribute("usuario",userBD); response.sendRedirect("/agendaLocalWeb_session_cookie/sistema.jsp"); }else{ String msgErro = "Caro usuário, login inválido."; request.setAttribute("msgErro", msgErro); (getServletContext().getRequestDispatcher("/index.jsp")).forward(request, response); } userDao.closeConn(); ...
Sessão no JSP • O atributos de uma sessão são mantidos em um objeto HttpSession referenciado pela variável session. • Pode-se armazenar valores em uma sessão por meio do método setAttribute() e cuperá-los por meio do método getAttribute().
Sessão no JSP – Atributo session • Diretiva pagesession="true|false” • Um valor true (default) indica que a variável predefinida session(HttpSession) deve ser associada à sessão, se existir, caso contrário uma nova sessão deve ser criada e associada a ela. • Um valor false indica que nenhuma sessão será usada. • Vale ressaltar que quando não especificado o valor do atributo session, o mesmo assume true como valor padrão.
Autenticação • Como implementar uma autenticação do usuário??? • Vamos definir que quando um usuário estiver logado, existirá um objeto que represente-o na sessão. • Caso algum usuário tente acessar alguma página da aplicação e o objeto não exista na sessão, o acesso não deverá ser permitido.
Autenticação • Para validar a autenticação nos servlets, deveremos incluir as seguinte linhas antes de realizarmos qualquer operação. if (request.getSession( ) == null ||request.getSession( ).getAttribute(“usuario”) == null){ request.getRequestDispatcher("/index.jsp").forward(request, response); return; } .... /* operações do servlet */
Autenticação • Para validar a autenticação nas página JSP, deveremos incluir as seguinte linhas antes de realizarmos qualquer operação na página. <% if (session == null ||session.getAttribute("usuario") == null){ request.getRequestDispatcher("/index.jsp").forward(request, response); return; } %>
Autenticação • Outra alternativa seria criar um arquivo jsp com o código abaixo, e incluí-lo dentro de cada uma das páginas existente na aplicação, através da diretiva include. <% if (session == null ||session.getAttribute("usuario") == null){ request.getRequestDispatcher("/index.jsp").forward(request, response); return; } %> Arquivo autentica.jsp
Autenticação <%@pageimport="br.com.unipac.usuario.entity.Usuario;" session="true" %> <%@include file="autenticacao.jsp" %> <htmlxmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>UntitledDocument</title> </head> ... Arquivos * .jsp A diretiva include é usada para incluir um arquivo estático em uma página JSP, analisando os código JSP presente no arquivo a ser incluído.SINTÁXE JSP:<%@ include file="url_relativa" %>
Sessão – gerenciada pela url • Em algumas situações o usuário poderá desabilitar o gerenciamento de cookie do browse. • Como conseqüência, torna-se possível o gerenciamento da sessão usuário, pois o servidor não consegue obter o id da sessão. • Para contornar essa situação, será necessário o gerenciamento de sessão através do método de reescrita da sessão.
Sessão – gerenciada pela url • Esta técnica anexa o ID de sessão com um parâmetro de solicitação a todos as URL que se linkam as páginas locais ao servidor da web. • A reescrita de URL tende a demandar mais trabalho da parte de desenvolvedores de sites ,já que todas as referências as URL´s devem ser geradas dinamicamente ,a fim de fluir o ID de sessão apropriado específico de usuário.
Sessão – gerenciamento pela url • Request1, chegou cookie JSESSIONID? • Sim, o container recupera os dados relativos essa sessão e contrói objeto session • Não, antes de criar uma nova Sessão, verifica se veio JSESSIONID pela url (pode ser que o cookie esteja desabilitado no cliente) • Sim, veio cookie na URL, então contrói objeto sessão.Não, Cria um novo objeto sessão. • Não, cria um novo objeto sessão.
Sessão – gerenciamento pela url • Os mecanismos responsáveis pela reescritaURL são os métodosencodeURLe encodeRedirectURLdo objeto Response. • O segundo método é o irmão do sendRedirecte tem a mesma função com o único incremento que adiciona o JSESSIONID ao fim.