30
Java avançado

Java avançado

  • Upload
    chana

  • View
    81

  • Download
    0

Embed Size (px)

DESCRIPTION

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. - PowerPoint PPT Presentation

Citation preview

Page 1: Java avançado

Java avançado

Page 2: Java avançado

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 - Contextualização

Page 3: Java avançado

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.

Sessão – Protocolo HTTP

Page 4: Java avançado

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 - Conceitualização

Page 5: Java avançado

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

Page 6: Java avançado

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.

Cookie - Limitação

Page 7: Java avançado

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

Page 8: Java avançado

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 – Tipos de controle

Page 9: Java avançado

Por padrão o arquivo web.xml já possui um tempo definido para sessão, como pode ser visto abaixo.

Sessão – Timeout padrão

<session-config> <session-timeout> 30 </session-timeout> </session-config>

Page 10: Java avançado

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:

Sessão – Configurar tempo

<session-config> <session-timeout> 3 </session-timeout> </session-config>

Page 11: Java avançado

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 gerenciada por cookie

Page 12: Java avançado

Para obtermos o objeto sessão em um servlet utilizaremos o método getSession() do objeto request.◦ HttpSession session = request.getSession( );

Retorna um objeto sessão caso exista, caso contrário, crie um novo e retorne-o.

◦ HttpSession session = 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 – Obtendo HttpSession

Page 13: Java avançado

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.

Sessão – Interface HttpSession

API HttpSession

Page 14: Java avançado

public long getCreationTime()◦ Para saber qual dia/horário foi criada a sessão.

public java.lang.String getId()◦ Retorna um objeto String que identifica a sessão.

public long getLastAccessedTime()◦ Para saber o dia/horário da ultima requisição feita

naquela sessão.

Sessão – Interface HttpSession

Date acess = new Date(session.getCreationTime()); Format formatter = new SimpleDateFormat("MM/dd/yy"); System.out.print( formatter.format(acess) );

Page 15: Java avançado

public void setMaxInactiveInterval(int interval)◦ 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. public int getMaxInactiveInterval()

◦ Retorna o tempo de limite definido para a sessão. public java.lang.Object

getAttribute(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

Page 16: Java avançado

public java.util.Enumeration getAttributeNames()◦ Retorna um Objeto Enumeration contendo todos

os nomes dos atributos colocados na sessão.

public void setAttribute(java.lang.String name,java.lang.Object value)◦ Coloca algum objeto na sessão.

Sessão – Interface HttpSession

Enumeration elements = session.getAttributeNames(); while( elements.hasMoreElements() ){ System.out.print( elements.nextElement() ); }

Page 17: Java avançado

public void removeAttribute(java.lang.String name)◦ Remove um objeto que foi armazenado na sessão.

public void invalidate()◦ 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. public boolean isNew()

◦ Retorna true se o cliente ainda não tem o conhecimento da sessão.

Sessão – Interface HttpSession

Page 18: Java avançado

Exemplo - manipulação na sessão ...

UsuarioDao userDao = new UsuarioDao(); Usuario userBD = userDao.getUser(user);

if( ( userBD != null) && (userBD.getSenha().equals(password) )){HttpSession session = 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();...

Page 19: Java avançado

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

Page 20: Java avançado

Diretiva page session="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.

Sessão no JSP – Atributo session

Page 21: Java avançado

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

Page 22: Java avançado

Para validar a autenticação nos servlets, deveremos incluir as seguinte linhas antes de realizarmos qualquer operação.

Autenticação

if (request.getSession( ) == null || request.getSession( ).getAttribute(“usuario”) == null){ request.getRequestDispatcher("/index.jsp").forward(request, response); return; }..../* operações do servlet */

Page 23: Java avançado

Para validar a autenticação nas página JSP, deveremos incluir as seguinte linhas antes de realizarmos qualquer operação na página.

Autenticação

<% if (session == null || session.getAttribute("usuario") == null){ request.getRequestDispatcher("/index.jsp").forward(request, response); return; }%>

Page 24: Java avançado

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.

Autenticação

<% if (session == null || session.getAttribute("usuario") == null){ request.getRequestDispatcher("/index.jsp").forward(request, response); return; }%>

Arquivo autentica.jsp

Page 25: Java avançado

Autenticação

Arquivos * .jsp

<%@page import="br.com.unipac.usuario.entity.Usuario;" session="true" %><%@include file="autenticacao.jsp" %><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><title>Untitled Document</title></head>...

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" %>

Page 26: Java avançado

Aplicação de exemplo

Page 27: Java avançado

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

Page 28: Java avançado

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 – gerenciada pela url

Page 29: Java avançado

Request 1, 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

Page 30: Java avançado

Os mecanismos responsáveis pela reescritaURL são os métodos encodeURL e encodeRedirectURLdo objeto Response. ◦ O segundo método é o irmão do sendRedirect e

tem a mesma função com o único incremento que adiciona o JSESSIONID ao fim.

Sessão – gerenciamento pela url