(descobrindo quando o usuário sai de uma aplicação asp.net – parte 2)

5
Entrar Esqueceu a senha Quem somos Fale conosco Seguir @ecode10 97 seguidores Artigos Revistas Empregos Colaboradores Vídeos Podcast Fórum Direitos Autorais Cadastre-se Grátis Cadastrar Artigos Cadastrar Notícias Cadastrar Empregos Consultar Empregos e-Books C# Apple Novidades Mobilidade Automação Comercial WebService Banco de Dados Podcasts Vídeos Descobrindo quando o usuário sai de uma aplicação ASP.NET – Parte 2 por Ricardo Oneda em 28/2/2007 Tweet 1 0 Introdução Na primeira parte deste artigo, foi mostrado como podemos detectar a inatividade do usuário de uma aplicação ASP.NET através do evento Session_End. Como explicado, o evento Session_End ocorre somente quando o tempo de inatividade especificado é atingido. Ou seja, quando o usuário acessa um outro site ou fecha o browser, o evento Session_End não é disparado automaticamente. Isso acontece porque os eventos de troca de site e de fechamento de browser ocorrem no lado cliente da aplicação, enquanto que o evento Session_End é um evento que ocorre no lado servidor. Outra limitação do evento Session_End é que ele só é chamado quando o modo do estado de sessão estiver configurado como InProc. Ou seja, quando utilizarmos algum servidor de estado para armazenar a sessão, o evento não será disparado. Caso desejemos fazer algum processamento no exato momento em que o usuário acessa outro site ou fecha o browser, precisamos desenvolver alguma funcionalidade que “avise” o servidor que algum desses eventos ocorreu. Nesta parte do artigo, explicarei algumas técnicas para que a aplicação possa notificar a ocorrência desses eventos ao servidor. Evento onunload Quando trocamos o site que estamos visitando ou fechamos a janela do browser, o evento javascript onunload é disparado no lado cliente. Portanto, esse é o local ideal para colocarmos o código de tratamento específico para quando o usuário deixar a aplicação. O que se costuma fazer neste evento é chamar uma página que seja responsável pelo encerramento da sessão do usuário. Isso pode ser feito de algumas maneiras. A forma mais comum era utilizar código javascript para abrir uma popup, apontando para a página Microsoft ® Translator Mensagem pra você! Torne-se autor do site escrevendo artigos e ebooks, criando vídeos e podcast's. Veja também os nossos vídeos publicados gratuitamente. Cadastrar artigo Cadastrar emprego Cadastrar notícia Publicidade Traduzir esta página Inglês Busca Online: Share Share Enviar Curtir ecode10 ecode10 Descobrindo quando o usuário sai de uma aplicação ASP.NET – Parte 2 http://www.ecode10.com/artigo/337/Descobrindo+quando+o+usuario+... 1 de 5 18/06/2012 14:30

Upload: marquesbrasil1467

Post on 24-Jul-2015

113 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: (Descobrindo quando o usuário sai de uma aplicação ASP.NET – Parte 2)

Entrar Esqueceu a senha Quem somos Fale conosco Seguir @ecode10 97 seguidores

Artigos Revistas Empregos Colaboradores Vídeos Podcast Fórum Direitos Autorais

Cadastre-se Grátis Cadastrar Artigos Cadastrar Notícias Cadastrar Empregos Consultar Empregos e-Books

C# Apple Novidades Mobilidade Automação Comercial WebService Banco de Dados Podcasts Vídeos

Descobrindo quando o usuário sai de uma aplicação ASP.NET

– Parte 2por Ricardo Oneda em 28/2/2007

Tweet 1

0

Introdução

Na primeira parte deste artigo, foi mostrado como podemos detectar a inatividade do

usuário de uma aplicação ASP.NET através do evento Session_End. Como explicado, o

evento Session_End ocorre somente quando o tempo de inatividade especificado é

atingido. Ou seja, quando o usuário acessa um outro site ou fecha o browser, o evento

Session_End não é disparado automaticamente. Isso acontece porque os eventos de troca

de site e de fechamento de browser ocorrem no lado cliente da aplicação, enquanto que o

evento Session_End é um evento que ocorre no lado servidor. Outra limitação do evento

Session_End é que ele só é chamado quando o modo do estado de sessão estiver

configurado como InProc. Ou seja, quando utilizarmos algum servidor de estado para

armazenar a sessão, o evento não será disparado. Caso desejemos fazer algum

processamento no exato momento em que o usuário acessa outro site ou fecha o browser,

precisamos desenvolver alguma funcionalidade que “avise” o servidor que algum desses

eventos ocorreu. Nesta parte do artigo, explicarei algumas técnicas para que a aplicação

possa notificar a ocorrência desses eventos ao servidor.

Evento onunload

Quando trocamos o site que estamos visitando ou fechamos a janela do browser, o evento

javascript onunload é disparado no lado cliente. Portanto, esse é o local ideal para

colocarmos o código de tratamento específico para quando o usuário deixar a aplicação. O

que se costuma fazer neste evento é chamar uma página que seja responsável pelo

encerramento da sessão do usuário. Isso pode ser feito de algumas maneiras. A forma

mais comum era utilizar código javascript para abrir uma popup, apontando para a página

Microsoft® Translator

Mensagem pra você!

Torne-se autor do site

escrevendo artigos e ebooks,

criando vídeos e podcast's.

Veja também os nossos vídeos

publicados gratuitamente.

Cadastrar artigo

Cadastrar emprego

Cadastrar notícia

Publicidade

Traduzir esta página

Inglês

Busca Online:

ShareShare

EnviarCurtir

ecode10

ecode10

Descobrindo quando o usuário sai de uma aplicação ASP.NET – Parte 2 http://www.ecode10.com/artigo/337/Descobrindo+quando+o+usuario+...

1 de 5 18/06/2012 14:30

Page 2: (Descobrindo quando o usuário sai de uma aplicação ASP.NET – Parte 2)

responsável pela finalização da sessão. Com a crescente popularização dos bloqueadores

de popups, essa técnica tornou-se ineficiente, pois os bloqueadores, ao impedirem a

abertura da popup, impossibilitam que a página no servidor seja chamada. No exemplo

deste artigo, será utilizado o conceito de AJAX - Asynchronous JavaScript and XML, para

fazer a chamada à página. Explicada de maneira simplificada, a técnica AJAX permite que

código javascript acesse o servidor web sem a necessidade de submeter a página, como

ocorreria com um Web Form tradicional. Isso permitirá que o servidor seja acessado sem

a necessidade de abertura de popup.

No Visual Studio 2005, abra o Web Site Saida que foi criado na primeira parte deste

artigo. No Solution Explorer, clique com o botão direito do mouse sobre o Web Site Saida

e escolha a opção Add New Item. Na janela que é aberta, escolha o template Web Form.

Dê o nome de Finaliza.aspx e escolha a linguagem Visual C#. Esta página que

acabamos de criar será a responsável por expirar a sessão do usuário quando o evento

onunload ocorrer. Ainda no Solution Explorer, clique com o botão direito sobre a página

Finaliza.aspx e escolha a opção View Code, para que o editor de código do Visual

Studio seja aberto. No evento Page_Load da página, adicione o seguinte código:

protected void Page_Load(object sender, EventArgs e)

{

Session.Abandon();

}

No código acima, chamamos o método Abandon() do objeto Session, que é responsável

por finalizar a sessão atual. Quando ele é executado, forçamos a expiração da sessão.

Assim, o evento Session_End também é disparado quando o método Abandon() é

executado.

Obs: lembre-se que se estivéssemos utilizando um modo de armazenamento de sessão

diferente de InProc, o evento Session_End não seria chamado. Neste caso, teríamos que

colocar o código do evento Session_End dentro do evento Page_Load da página

Finaliza.aspx. Para mais informações sobre as formas de armazenamento de sessão do

ASP.NET, consulte as Referências ao final do artigo.

Agora, no evento onunload do browser, precisamos programar a chamada à página

Finaliza.aspx. No Solution Explorer, clique com o botão direito do mouse sobre a

página Pagina1.aspx e escolha a opção View Markup. Isso nos levará ao conteúdo HTML

da página. Na tag <body>, adicione o atributo onunload com a chamada para a função

javascript que será executada quando este evento ocorrer. A tag deverá ficar parecida

com o seguinte trecho:

<body onunload="finaliza();">

Dentro das tags <head></head>, declare a função javascript finaliza(), conforme o código

abaixo. Nele, utilizamos o objeto XMLHttpRequest, que é o principal componente do

AJAX e responsável pelo conexão com o servidor Web. Como existem algumas diferenças

na forma em que este objeto é instanciado entre cada browser, fazemos várias tentativas

até que tenhamos um objeto válido. Depois, chamamos o método open() passando como

parâmetros o método de acesso à página (“GET”), a página que desejamos acessar

(“Finaliza.aspx”) e um valor booleano indicando se a requisição é assíncrona. Quando

passamos true neste parâmetro, a chamada é feita assincronamente. Isso significa que o

processamento do script continuará, independentemente da resposta vir do servidor.

Assim, o browser não bloqueia o acesso a página e o usuário continua trabalhando com

ela normalmente. Se passássemos false, a chamada seria feita em modo síncrono, ou

seja, o browser iria esperar a resposta do servidor web para dar continuidade a execução

do script. Enquanto a resposta não viesse, o usuário não conseguiria fazer mais nada na

página, dando a sensação de travamento. Por último, chamamos o método send() para

que o acesso seja feito.

<script language="javascript" type="text/javascript">

function finaliza()

{

Join the conversation

ecode10 Kinect Animals para Android e iOSecode10.com/artigo/1536/Ki…@ecode10about 1 hour ago · reply · retweet ·

ecode10 Mistério Microsoft hojeecode10.com/artigo/1535/Mi…@ecode10about 1 hour ago · reply · retweet ·

ecode10 Ultrabook Acer Aspire S5 -ecode10.com/artigo/1534/Ac…@ecode102 days ago · reply · retweet · favorite

ecode10 Comunicação entre Formsecode10.com/artigo/1533/Co…@ecode102 days ago · reply · retweet · favorite

ecode10 O custo do Windows 8ecode10.com/artigo/1532/O+…@ecode103 days ago · reply · retweet · favorite

ecode10 Vídeo - Curso de C# (dois vídeosgrátis para visualizar) - acesse e veja:ecode10.com/artigo/1531/vi…@ecode105 days ago · reply · retweet · favorite

ecode10 Supermark List - suas comprascontroladas no supermercado, baixe grátis naApple Store - ecode10.com/artigo/1530/Su…via @ecode105 days ago · reply · retweet · favorite

ecode10 Hotmail com nova caraecode10.com/artigo/1528/Ho…@ecode107 days ago · reply · retweet · favorite

ecode10 Rumor iPhone 5ecode10.com/artigo/1526/Ru…@ecode109 days ago · reply · retweet · favorite

ecode10 Visual Studio 12 RC - Novidades daferramenta - ecode10.com/artigo/1524/Vi…via @ecode1011 days ago · reply · retweet · favorite

ecode10 Lenovo ThinkPad com Windows 8ecode10.com/artigo/1523/Le…@ecode1011 days ago · reply · retweet · favorite

ecode10 [T-SQL] Count(1) x Count(PK) xCount() ecode10.com/artigo/1521/T-…@ecode1012 days ago · reply · retweet · favorite

ecode10 Podcast falando sobre segurançaecode10.com/artigo/1520/Po…@ecode1012 days ago · reply · retweet · favorite

Descobrindo quando o usuário sai de uma aplicação ASP.NET – Parte 2 http://www.ecode10.com/artigo/337/Descobrindo+quando+o+usuario+...

2 de 5 18/06/2012 14:30

Page 3: (Descobrindo quando o usuário sai de uma aplicação ASP.NET – Parte 2)

var xmlHttp=false;

try {

xmlHttp = new XMLHttpRequest();

} catch (e1) {

try {

xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");

} catch (e2) {

xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

}

}

xmlHttp.open("GET", "Finaliza.aspx", true);

xmlHttp.send(null);

}

</script>

No Solution Explorer, clique com o botão direito do mouse sobre a página Pagina1.aspx

e escolha a opção View in Browser. Para testar o funcionamento do que acabamos de

fazer, acesse um outro site ou então feche o browser. Após uma dessas ações, vá ao

Control Panel do Windows ® Administrative Tools ® Event Viewer. Selecione o log

Application e veja o log que foi gerado por nossa aplicação. Isso mostra que quando o

evento onunload foi disparado por alguma ação do lado cliente, a função javascript

finaliza() chamou a página que desenvolvemos para forçar a expiração da sessão, o que

por sua vez gerou a chamada ao evento Session_End, que gravou a informação de sessão

expirada no log de evento do Windows.

Conclusão

Na segunda parte do artigo vimos como é possível acionar uma página no servidor web a

partir de eventos ocorridos no cliente (browser). Assim, podemos detectar quando o

usuário acessa um outro site ou então quando fecha o browser. Também solucionamos o

problema causado pela limitação do Session_End só ser chamado quando utilizamos o

modo de armazenamento InProc. Entretanto, ainda temos um problema nessa solução.

Do jeito que foi implementada, sempre que outra página for acessada, a página

Finaliza.aspx será chamada. O evento onunload não faz distinção entre páginas da

mesma aplicação ou páginas de outros sites. Esse evento sempre é chamado em resposta

à saída da página atual. Isso é um problema, já que uma aplicação web normalmente é

composta de várias páginas. Assim, ao acessarmos uma outra página de nossa aplicação,

a sessão acabará sendo finalizada, o que não é o comportamento correto. Na próxima

parte deste artigo, explicarei como podemos contornar este problema e somente finalizar

a sessão quando a aplicação for abandonada, e não a página.

Referências

Código fonte do exemplo deste artigo

http://www.aspneti.com/artigos/ExemploDetectarSaida.zip

Gerenciamento de Estado no Servidor – Parte 1 http://www.msdnbrasil.com.br

/sharepedia/visualizarartigo.aspx?id=57763

Gerenciamento de Estado no Servidor – Parte 2

http://www.msdnbrasil.com.br/sharepedia/visualizarartigo.aspx?id=57906

Dynamic HTML and XML: The XMLHttpRequest Object

http://developer.apple.com/internet/webcontent/xmlhttpreq.html

Sobre o Autor

Descobrindo quando o usuário sai de uma aplicação ASP.NET – Parte 2 http://www.ecode10.com/artigo/337/Descobrindo+quando+o+usuario+...

3 de 5 18/06/2012 14:30

Page 4: (Descobrindo quando o usuário sai de uma aplicação ASP.NET – Parte 2)

Ricardo Oneda Pereira de Toledo é formado em Processamento de Dados pela

Faculdade de Tecnologia de São Paulo, é MCAD – Microsoft Certified Application

Developer, com ênfase em aplicações Web com C# e Banco de Dados SQL Server 2000 e

é MVP – Most Valuable Professional em ASP/ASP.NET. Atualmente trabalha como Analista

de Sistemas no desenvolvimento de aplicações Web. Visite o blog em

http://oneda.mvps.org/blog

voltar comente subir

Ricardo Oneda

Comentários:

Comentado por: Juan Carneiro - 28/2/2008 0:00:00

Ricardo, se quero que a sessão se mantenha no meu site. E somente seja zerada se o destino da url seja outro site ou o

fechamento do navegador?

Comentado por: Juan Carneiro - 28/2/2008 0:00:00

Simples resposta Juan, leia a parte 3.

Comentado por: Roberta Franco - 4/11/2010 0:00:00

Ola eu estou usando master page na minha aplicação, como fazer neste caso?

Comente (dê sua opinião):

Comentário:

Código Imagem: (digite o código da imagem respeitando maiúsculo e minúsculo)

Favor digitar o código da imagem para cadastramento.

Outros Artigos do AutorDescobrindo quando o usuário sai de uma aplicação ASP.NET – Parte 2

Descobrindo quando o usuário sai de uma aplicação ASP.NET – Parte 3

Descobrindo quando o usuário sai de uma aplicação ASP.NET – Parte 1

© ecode10.com | Fale conosco | Quem somos | Célula acadêmica | Anuncie aqui | RSS

Tópicos / Artigos

- Apple

- Banco de dados

- C# (CSharp)

- ASP.NET

- VB.NET

- Novidades

- Mobilidade

- Automação comercial

- WebServices

Diversos

- Empregos

- Fórum

- Revistas

- Colaboradores

- Podcasts

- e-Books

- Vídeos

Comunidade eCode10

- Direitos autorais

- Cadastrar artigos

- Cadastrar notícias

- Cadastrar empregos

- Consultar empregos

Usuários

Descobrindo quando o usuário sai de uma aplicação ASP.NET – Parte 2 http://www.ecode10.com/artigo/337/Descobrindo+quando+o+usuario+...

4 de 5 18/06/2012 14:30

Page 5: (Descobrindo quando o usuário sai de uma aplicação ASP.NET – Parte 2)

- Delphi

- Finanças

- Fisioterapia

- Java

- JavaScript

- LINQ

- TCP/IP

- Vídeos online

- Vírus / SPAM

- ASP 3.0

- Arquitetura

- Esqueceu a senha

- Quem somos

- Fale conosco

- Cadastre-se grátis

Descobrindo quando o usuário sai de uma aplicação ASP.NET – Parte 2 http://www.ecode10.com/artigo/337/Descobrindo+quando+o+usuario+...

5 de 5 18/06/2012 14:30