<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Latest posts for the topic "25) Controle de usuários (HttpSessionAttributeListener, JavaScript e MentaAjax)"]]></title>
		<link>http://forum.mentaframework.org/posts/list/19.page</link>
		<description><![CDATA[Latest messages posted in the topic "25) Controle de usuários (HttpSessionAttributeListener, JavaScript e MentaAjax)"]]></description>
		<generator>JForum - http://www.jforum.net</generator>
			<item>
				<title>25) Controle de usuários (HttpSessionAttributeListener, JavaScript e MentaAjax)</title>
				<description><![CDATA[ <span style="font-size: 18px; line-height: normal"><font color='red'><b>[EDITADO]</b></font></span>
<font color='red'>LEIA O ULTIMO POST.</font>

Uma vez surgiu uma dúvida de como que eu poderia controlar a quantidade de usuários logados para sistemas que assim exigem, e em conversa com o Robert e Sérgio corri atrás de uma solução junto com o Diego (Desenvolvedor Web Standards da empresa que trabalho).

Baseado nesse problema de controlar sessões de usuários eu (Leiber) e Diego fizemos um controle de usuários logados, utilizando JavaScript, MentaAjax, e HttpSessionAttributeListener, e o diego escreveu esse FAQ muito bem explicado por sinal.

<b>1 - Qual a necessidade de se controlar usuários logados do sistema?</b>
Isso sempre vai depender da real necessidade de você controlar isto, lembre-se ? Não faça bem feito o que não é pra ser feito?, ou seja, não preciso de uma Ferrari pra ir a padaria, posso ir a pé mesmo, é mais econômico e faz bem :) .

Mas imagine um sistema que você tenha que controlar o número simultâneo de usuários logados no sistema (licença por usuário), então este FAQ te oferece uma solução para controlar isto em sua aplicação.

<b>2 - Mas qual é o problema?</b>
Bom, o problema é o seguinte: Seu usuário efetua o login no sistema, após ele efetuar algum trabalho no sistema ele deseja sair. Se ele clicar no botão sair tudo funciona corretamente a sessão será removida pelo Logout do mentawai, mas se por força do hábito, ele simplesmente aperta o botão fechar do navegador? Quando o usuário faz isto, não há tempo de se executar a função LOGOUT e a sessão continuará existindo até expirar normalmente. Se você pensar em "licença por usuário" isto com certeza seria um belo problema, pois teríamos 1 (um) usuário logado inativo.

<b>2.1 - Um exemplo prático:  Um sistema que permite até 3 (três) usuários conectados simultaneamente.</b>
a - Digamos que temos nesse sistema 2 (dois) usuários (A e B) logados.
b - Um terceiro (C) usuário efetua seu login. Completamos a lista máxima de usuários logados 3 (três) correto?
c - O usuário B fechou o browser sem clicar em logout, logoff, whatever. A sessão conforme explicado acima ainda existe correto?
d - Um outro usuário (D) tenta efetuar seu login e recebe uma mensagem informando que o número máximo de usuários no sistema foi atingido e que não poderá utilizar o sistema. Sendo que usuários utilizando o sistema realmente existem 2 (dois) A, C, então teoricamente o D deveria ter acessado o sistema.

<b>3 - Como contornar este problema?</b>
Para fugir desse problema a idéia é monitorar a sessão do servidor utilizando o HttpSessionAttributeListener, e o navegador utilizando o JavaScript.

<b>Concentre-se no item 2.1 item c.</b>
O que irá acontecer se o usuário simplesmente fechar o browser, ou seja, "sair incorretamente do sistema"? Teoricamente sempre que o usuário executasse uma ação na aplicação ou simplesmente recarregasse a página a sessão teria que ser atualizada. No caso de se fechar a janela do navegador, é necessário informar ao servidor que o usuário está deixando a aplicação, para que o servidor possa derrubar sua respectiva sessão. Como fazer isto? Vamos entender como funciona o JavaScript neste momento.

<b>4 - Como o navegador se comporta?</b>
Sempre que a janela do navegador é atualizada, ou quando o usuário muda de página (viajando pelo histórico do navegador ou digitando um novo endereço na barra de endereços), ou quando fecha a janela, é disparado um evento chamado beforeunload ("antes de descarregar"). Sempre que há uma mudança na página este evento é disparado. Após este evento é disparado logo em seguida o evento unload("descarregar") responsável pelo momento em que o navegador é fechado. Oque temos que fazer é associar um event listener ao evento beforeunload, para que antes que o navegador seja fechado (seja por CTRL+F4, ALT+F4, botão fechar...) o servidor saiba que o usuário está deixando a aplicação e derrube sua sessão. Tendo isto em mente já sabemos oque fazer. Mas e como fazer?

<b>5 - Verificando eventos do browser</b>
Infelizmente como tantas outras coisas em nosso meio não existe um padrão universal para todos os navegadores. Cada um criou o seu próprio método (até porque o IE usa o JScript e os demais o JavaScript). Então vamos lá, sem mais papo furado vamos ao que interessa. Para se escrever algo compatível com os padrões web standards utilizaremos duas funções javascript para captura de eventos: attachEvent (IE), addEventListener (FF, Mozilla...). Teremos como algo dois objetos da árvore DOM: o document, e o window. Explicarei como funcionam estas funções, pois caso alguém não saiba, já servirá como base de aprendizado. A sintaxe é a seguinte:

<b>5.1 - IE</b>
objectElement.attachEvent("onEvent", function);
Onde:
 - objectElement é o objeto que vai receber o listener;
 - onEvent é o evento que vai ser "rastreado". No caso do beforeunload ficaria onbeforeunload (leia "quando for antes de descarregar" para entender a lógica);
 - function é a função que vai ser executada quando o evento for disparado.

<b>5.2 - FF e outros</b>
objectElement.addEventListener("event", function, [boolean true, false]);
Onde:
 - objectElement é o objeto que vai receber o listener;
 - event é o evento que vai ser "rastreado". No caso do beforeunload ficaria beforeunload mesmo. Diferentemente do attachEvent não é recessário colocar o "on" antes do evento;
 - function é a função que vai ser executada quando o evento for disparado.
 - [boolean true, false] é um valor que pode ser true ou false. Define a propriedade bubble do evento. Não se preocupe muito com este item, não é necessária sua explicação para este caso.

Sabendo como utilizar as funções vamos ao código JavaScript.

<b>Aplicando na prática</b>

O JSP.
Na sua página JSP, insira o código javascript abaixo (para um melhor entendimento o código segue todo comentado).

<span class="genmed"><b>Code:</b></span><br>
		<div style="overflow: auto; width: 100%;">
		<pre>&lt;script type="text/javascript"&gt; 
&lt;!--

//Código ajax do mentawai responsável por efetuar o logout antes de fechar o browser. 
//Para maiores esclarecimentos sobre esta função leia: FAQ: Ajax Fácil com Mentawai &#40;MentaAjax&#41;
function doRequest&#40;&#41; {
var req = new mtw.request&#40;&#41;;
req.setUrl&#40;"/MinhaApp/Logout.do"&#41;;
req.onSuccess&#40;true&#41;;
req.send&#40;&#41;;
 }

// Iniciamos setando uma variável que será responsável em dizer se a página está sendo
// recarregada ou não. Note que a variável inicia com valor false. Isto é muito importante.
var reloaded = false;
// Esta função verifica se está sendo dado algum comando através do teclado para
// recarregar a página &#40;F5, CTRL + R&#41;. Ela retorna true ou false
function checkReload&#40;evt&#41; {
	if&#40;evt.keyCode == 116 || &#40;evt.altKey && evt.keyCode == 82&#41;&#41;
	return true;
	else
	return false;
}
// Aqui nós verificamos quais as teclas o usuário está pressionando.
// Neste momento só nos interessa saber duas coisas: se o usuário está fechando o browser ou se
// ele está apenas recarregando. No nosso caso nós só queremos executar algo se o usuário sair
// indevidamente do sistema, então se ele recarregar a página nada deverá ser executado.
// Este é o ponto crucial do script.
// Se o usuário estiver tentando fechar o navegador &#40;ALT + F4 ou CTRL + F4&#41; a variável reloaded 
//será setada como false, ou seja, o usuário não está recarregando a página. Portanto nós podemos
// executar nossa função de LOGOUT. Agora se o usuário está tentando recarregar a página &#40;F5,
// CTRL + R...&#41; a variável será setada como true e nada irá acontecer.
function verify&#40;evt&#41; {
	// CTRL + F4
	if&#40;evt.ctrlKey && evt.keyCode == 115&#41; {
		reloaded = false;
	}
	// ALT + F4
	if&#40;evt.altKey && evt.keyCode == 115&#41; {
		return reloaded = false;
	}
	// F5 e CTRL + R
	if&#40;checkReload&#40;evt&#41;&#41; {
		return reloaded = true;
	}
}
// Esta função faz o trabalho crucial. Ela recebe uma variável: a browserFlag que indica qual
// navegador está sendo utilizado. Esta variável foi mantida apenas no caso de você querer fazer
// algo diferente para cada navegador. No caso nós chamamos a mesma função para todos os
// navegadores, então não seria necessária esta verificação. Mas fica aí como exemplo :&#41;
// Ao chamar a função, esta mesma verifica qual o valor da variável global reloaded. Se esta for
// false &#40;o navegador não está sendo recarregado&#41; ela envia uma requisição ao servidor através
// de uma função ajax solicitando que a sessão seja derrubada. Se for true, nenhuma requisição
// é enviada e nada acontece. Lembrando que neste ponto você pode fazer oque quiser, basta
// mudar o código da função para incrementá-la.
function closeWindow&#40;browserFlag&#41; {
	if&#40;!reloaded&#41; {
		if&#40;browserFlag == 'ie'&#41; {
			doRequest&#40;&#41;;
		} else { 
			doRequest&#40;&#41;;
		}
	}
}
// Aqui é realmente a parte mais importante do código, pode-se dizer. Verificamos com um simples 
// "if" qual o browser está sendo utilizado. if&#40;!document.addEventListener &&
//document.attachEvent&#41; quer dizer se não existir o método addEventListener e existir o método
// attachEvent então estamos trabalhando com o IE ou algum browser que suporte este método
// e utilizaremos o attachEvent. Caso contrário, o browser não suporta o attachEvent mas
// suporta o addEventListener, então o utilizaremos.
// Lembrando que todos os browsers modernos e atuais suportarão ou um ou outro.
if&#40;!document.addEventListener && document.attachEvent&#41; {
	// Aqui nós fazemos com que o evento keydown &#40;que é disparado sempre que uma tecla for
// pressionada&#41; seja ouvido pelo objeto document da árvore DOM. Então sempre que o
// usuário apertar algum botão na tela a função verify será chamada e será verificado
// o que ele está fazendo.
	document.attachEvent&#40;"onkeydown", function&#40;&#41;{verify&#40;event&#41;}&#41;;
	// Esta é realmente a chave do código. A função closeWindow é chamada apenas aqui.
	// Nós adicionamos o evento beforeunload no objeto window. Sempre que este evento
	// for disparado a função closeWindow será chamada e fará as verificações necessárias.
	// Isto ocorrerá sempre antes de a página mudar, for recarregada, for fechada... seja
// através de algum botão do navegador, ou algum comando do teclado. Ou seja, seja lá
// o que for acontecer na janela esta função será chamada :&#41;
	window.attachEvent&#40;"onbeforeunload", function&#40;&#41;{closeWindow&#40;'ie'&#41;}&#41;;

} else {
	// No FF em específico quando o evento beforeunload é disparado se a página não estiver
// totalmente carregada ele atropela tudo e dispara a função encerrando a função.
// Como alternativa, nós deixamos a variável setada inicialmente como true, oque
// não deixará a funão closeWindow enviar a requisição ao servidor. Essa variável
// somente irá passar para false quando a página for carregada, e quando o usuário mover 
// o mouse sobre a tela. Este é um contorno para um pequeno bug.
	reloaded = true;
	// Mesma coisa do IE
	document.addEventListener&#40;'keydown',function&#40;event&#41;{verify&#40;event&#41;;},false&#41;;
	window.addEventListener&#40;'beforeunload',function&#40;event&#41;{closeWindow&#40;'ff'&#41;;},false&#41;;
	// Ao mover o mouse a variável reloaded receberá o valor padrão correto, false
	document.addEventListener&#40;'mousemove',function&#40;&#41;{reloaded=false;},false&#41;;
}


//--&gt;
&lt;/script&gt;</pre>
		</div>

<b>LoginAction </b>
Abaixo temos como deverá estar o seu LoginAction que continuará a extender BaseLoginAction, mas deverá implementar também o HttpSessionAttributeListener que será o responsável por "monitorar" a quantidade de usuários.

<span class="genmed"><b>Code:</b></span><br>
		<div style="overflow: auto; width: 100%;">
		<pre>public class LoginAction extends BaseLoginAction implements HttpSessionAttributeListener {

private static final String MAX_LOGIN_ERROR = "Desculpe o número máximo de usuários logados foi atingido :-&#40;";

public String execute&#40;&#41; throws Exception {
    	Usuario user = model.isOk&#40;&#41;;

        if &#40;user != null&#41; {

//Imprimindo os valores
        	System.out.println&#40;"Quantidade de usuários logados = "+application.getAttribute&#40;"quantidade_de_logados"&#41;&#41;;
        	System.out.println&#40;"Quantidade máxima de usuários = "+application.getAttribute&#40;"maximo_de_logados"&#41;&#41;;

/*
* Vamos validar a quantidade de usuários logados. Se a quantidade de
* logados for inferior ao máximo permitido retorna success e dispara o 
* usuário para a tela do sistema
*/
        	if &#40;&#40;Integer&#41;application.getAttribute&#40;"quantidade_de_logados "&#41; &lt; &#40;Integer&#41; application.getAttribute&#40;"maximo_de_logados"&#41;&#41; {
	        	setUserSession&#40;user&#41;;
	        	return SUCCESS;
/*
* Caso o número limite de usuários logados foi atingido o usuário será 
* reencaminhado a tela de login com uma mensagem de erro, informando que
* o limite de usuários foi atingido. 
*/
        	}else{
        		addError&#40;MAX_LOGIN_ERROR&#41;;
                return ERROR;
        	}
        }
        addError&#40;LOGIN_ERROR&#41;;
        return ERROR;
    }

public void attributeAdded&#40;HttpSessionBindingEvent e&#41; {
		ServletContext c = e.getSession&#40;&#41;.getServletContext&#40;&#41;;
		synchronized &#40;c&#41; {
//Verificamos se o objeto inserido no session é uma instancia do nosso 
//bean Usuario
			if &#40;e.getValue&#40;&#41; instanceof Usuario && e.getName&#40;&#41;.equalsIgnoreCase&#40;"user"&#41;&#41; {
				Integer logUsers = &#40;Integer&#41; c.getAttribute&#40;"quantidade_de_logados"&#41;;
//Contador
				logUsers++;
				c.setAttribute&#40;"quantidade_de_logados", logUsers&#41;;
				System.out.println&#40;"Novo usuário logado"&#41;;
			}
		}
	}

	public void attributeRemoved&#40;HttpSessionBindingEvent e&#41; {
		ServletContext c = e.getSession&#40;&#41;.getServletContext&#40;&#41;;
		synchronized &#40;c&#41; {
//Verificamos se o objeto inserido no session é uma instancia do nosso 
//bean Usuario
			if &#40;e.getValue&#40;&#41; instanceof Usuario && e.getName&#40;&#41;.equalsIgnoreCase&#40;"user"&#41;&#41; {

				Usuario u = &#40;Usuario&#41; e.getValue&#40;&#41;;
				System.out.println&#40;"O usuário "+u.getNome&#40;&#41;+" deslogou corretamente!"&#41;;

				Integer logUsers = &#40;Integer&#41; c.getAttribute&#40;"quantidade_de_logados"&#41;;
				logUsers--;
				c.setAttribute&#40;"quantidade_de_logados", logUsers&#41;;
			}
		}
	}

	public void attributeReplaced&#40;HttpSessionBindingEvent e&#41; {}



}</pre>
		</div>

<b>Aquivo web.xml</b>
No arquivo do web.xml você deve informar qual sua ?action? deverá ser monitorada pelo Listener.
<span class="genmed"><b>Code:</b></span><br>
		<div style="overflow: auto; width: 100%;">
		<pre>&lt;listener&gt;
	&lt;listener-class&gt;
	meuspacotes.LoginAction
	&lt;/listener-class&gt;
&lt;/listener&gt;</pre>
		</div>

<b>No ApplicationManager.</b>
Criamos a variável que mantem o total de usuários logados.
<span class="genmed"><b>Code:</b></span><br>
		<div style="overflow: auto; width: 100%;">
		<pre>
public class ApplicationManager extends org.mentawai.core.ApplicationManager {

  private Integer maximo_de_logados  = 0;

  public void init&#40;Context application&#41; {
	//Setando o valor máximo de usuários logados ? default 0, ao se rodar o aplicação o valor começará a partir do zero.
   	application.setAttribute&#40;"maximo_de_logados", maximo_de_logados&#41;;
  }

}</pre>
		</div>

Pronto, utilizando desta forma você poderá restringir sem muitos riscos a quantidade de usuários logados no sistema.

<b>6 - Posso controlar outras informações?</b>
Teoricamente, sim. Você pode utilizar o conceito de controle sobre eventos, para efetuar determinadas tarefas no sistema ao se apertar, por exemplo, uma tecla F1 que dispara um evento chamando uma página de Ajuda, e assim por diante.

Bom dúvidas ou sugestões, Utilizem o Forum. 

Abraço a todos e bom proveito.

Diego Andrade
]]></description>
				<guid isPermaLink="true">http://forum.mentaframework.org/posts/list/1503.page#12069</guid>
				<link>http://forum.mentaframework.org/posts/list/1503.page#12069</link>
				<pubDate><![CDATA[Mon, 10 Sep 2007 12:49:29]]> GMT</pubDate>
				<author><![CDATA[ IceW0lf]]></author>
			</item>
			<item>
				<title>Re:FAQ: Controle de usuários (HttpSessionAttributeListener, JavaScript e MentaAjax)</title>
				<description><![CDATA[ Conforme sugerido pelo Robert.

Segue outra forma de você capturar os eventos do navegador.

<b>Substitua o código:</b>
<span class="genmed"><b>Code:</b></span><br>
		<div style="overflow: auto; width: 100%;">
		<pre>
if&#40;!document.addEventListener && document.attachEvent&#41; {
    document.attachEvent&#40;"onkeydown",function&#40;&#41;{verify&#40;event&#41;}&#41;;
    window.attachEvent&#40;"onbeforeunload",function&#40;&#41;{closeWindow&#40;'ie'&#41;}&#41;;
} else {
    reloaded = true;
    document.addEventListener&#40;'keydown',function&#40;event&#41;{verify&#40;event&#41;;},false&#41;;
    window.addEventListener&#40;'beforeunload',function&#40;event&#41;{closeWindow&#40;'ff'&#41;;},false&#41;;
    document.addEventListener&#40;'mousemove',function&#40;&#41;{reloaded=false;},false&#41;;
}
</pre>
		</div>


<b>Por:</b>
<span class="genmed"><b>Code:</b></span><br>
		<div style="overflow: auto; width: 100%;">
		<pre>	
if&#40;document.addEventListener&#41; {
    reloaded = true;
    Event.observe&#40;document, 'mousemove', function&#40;&#41;{reloaded=false;}, false&#41;;		
}
    Event.observe&#40;document, 'keydown', verify, false&#41;;
    Event.observe&#40;window, 'beforeunload', closeWindow, false&#41;;	
</pre>
		</div>

As vantagens dessa nova forma, é que você não precisa validar o navegados bem como seus eventos. A única necessidade desse if é porque ele serve como uma trava para a função quando o reloaded for igual a false, para o firefox apenas.

Se você quizer verificar o keyCode com expressões regulares, provavelmente terá dois ou três <b>ifs</b> em todo o JS necessário para efetuar as tarefas.]]></description>
				<guid isPermaLink="true">http://forum.mentaframework.org/posts/list/1503.page#12088</guid>
				<link>http://forum.mentaframework.org/posts/list/1503.page#12088</link>
				<pubDate><![CDATA[Tue, 11 Sep 2007 08:25:30]]> GMT</pubDate>
				<author><![CDATA[ IceW0lf]]></author>
			</item>
			<item>
				<title>Re:FAQ: Controle de usuários (HttpSessionAttributeListener, JavaScript e MentaAjax)</title>
				<description><![CDATA[ Outo código ainda mais reduzido.

Exemplo de uma Página JSP com o script.

<span class="genmed"><b>Code:</b></span><br>
		<div style="overflow: auto; width: 100%;">
		<pre>
&lt;%@ taglib uri="/WEB-INF/lib/mentawai.jar" prefix="mtw"%&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /&gt;
    &lt;title&gt;Teste logoff &lt;/title&gt;
&lt;mtw:ajaxConfig /&gt;
&lt;script&gt;
var reloaded = false;
function verify&#40;event&#41; {
	// CTRL + F4 ou ALT + F4
	if&#40;&#40;event.ctrlKey || event.altKey&#41; && event.keyCode == 115&#41; return reloaded = false;

	// F5 e CTRL + R
	if&#40;event.keyCode == 116 || &#40;event.altKey && event.keyCode == 82&#41;&#41; return reloaded = true;
}

function closeWindow&#40;&#41; {
	if&#40;!reloaded&#41; {
	 	var req = new mtw.request&#40;&#41;;
	 	req.setUrl&#40;"&lt;mtw:contextPath/&gt;/Logout.do"&#41;;
	 	req.onSuccess&#40;true&#41;;
	 	req.send&#40;&#41;;
	}
	
}
//
// Event listeners
//
if&#40;document.addEventListener&#41; {
	reloaded = true;
	Event.observe&#40;document, 'mousemove', function&#40;&#41;{reloaded=false;}, false&#41;;		
}
Event.observe&#40;document, 'keydown', verify, false&#41;;
Event.observe&#40;window, 'beforeunload', closeWindow, false&#41;;	
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
Clique para fechar o browser, ou ALT+F4, CTRL+F4, se vc estiver utilizando o LISTENER 
repare que será informado que o usuário X efetuou o logoff corretamente.
&lt;/body&gt;
&lt;/html&gt;
</pre>
		</div>]]></description>
				<guid isPermaLink="true">http://forum.mentaframework.org/posts/list/1503.page#12094</guid>
				<link>http://forum.mentaframework.org/posts/list/1503.page#12094</link>
				<pubDate><![CDATA[Tue, 11 Sep 2007 10:37:49]]> GMT</pubDate>
				<author><![CDATA[ IceW0lf]]></author>
			</item>
			<item>
				<title>Re:25) Controle de usuários (HttpSessionAttributeListener, JavaScript e MentaAjax)</title>
				<description><![CDATA[ Leiber,

Esse trecho não deveira ser assim?
<blockquote>
// F5 e CTRL + R
 	if(event.keyCode == 116 || (<b>event.altKey</b> && event.keyCode == 82)) return reloaded = true;
&nbsp;
		</blockquote>

Para:
<blockquote>
// F5 e CTRL + R
 	if(event.keyCode == 116 || (<b>event.ctrlKey</b> && event.keyCode == 82)) return reloaded = true;
&nbsp;
		</blockquote>


E tb poderia ser adicionado a combinação CTRL + F5, que pelo que eu sei (senso comun...rs), o browser recarrega todo o cache para a página.

<span class="genmed"><b>Code:</b></span><br>
		<div style="overflow: auto; width: 100%;">
		<pre>
// F5 , CTRL + R e CTRL + F5
 	if&#40;event.keyCode == 116 || 
                  &#40;event.ctrlKey && &#40;event.keyCode == 82 || event.keyCode == 116&#41;&#41;&#41; return reloaded = true;
</pre>
		</div>

Vlw parabens pelo FAQ
]]></description>
				<guid isPermaLink="true">http://forum.mentaframework.org/posts/list/1503.page#13416</guid>
				<link>http://forum.mentaframework.org/posts/list/1503.page#13416</link>
				<pubDate><![CDATA[Wed, 28 Nov 2007 11:48:14]]> GMT</pubDate>
				<author><![CDATA[ leonardo.pinho]]></author>
			</item>
			<item>
				<title>Re:25) Controle de usuários (HttpSessionAttributeListener, JavaScript e MentaAjax)</title>
				<description><![CDATA[ E ai blz,

Primeiramente, valeu o elogio!!!! Caso vc tenha ideias/conhecimentos que deseje compartilhar com nossa comunidade sinta-se a vontade em sugerir a nossa equipe.  :D

Cara o lance do <b>event.altKey</b> foi erro meu mesmo. Sabe como é, tu pega faz a parada, a parada roda ai começa a inventar dá merda  :D faltou teste ali.  :oops:

Com relação ao CTRL + F5 você vai concordar que "teoricamente" terá que funcionar, já que temos um "OR" (event.keyCode == 116 <b>||</b> ...) e que nesse caso se algo vier acompanhado da tecla "F5" returna true, mantendo a sessão.  :D

Você não concorda ?

Repare nesse trecho a idéia é a mesma.
if((event.ctrlKey || event.altKey) && event.keyCode == 115) return reloaded = false;

Ou seja o F4 veio acompanhado de ctrl ou alt... é sair mesmo!  :D

Vlw a participação!!!!!!!!!!

Uma abraço.

Ps. Atenção aos que desejam utilizar pois com ajax me parece que teremos problemas, exceto vc ao executar o seu ajax e junto deixar setado reloaded = true. (acho que isso já deve ajeitar as coisas)]]></description>
				<guid isPermaLink="true">http://forum.mentaframework.org/posts/list/1503.page#13417</guid>
				<link>http://forum.mentaframework.org/posts/list/1503.page#13417</link>
				<pubDate><![CDATA[Wed, 28 Nov 2007 12:11:06]]> GMT</pubDate>
				<author><![CDATA[ IceW0lf]]></author>
			</item>
			<item>
				<title>Re:25) Controle de usuários (HttpSessionAttributeListener, JavaScript e MentaAjax)</title>
				<description><![CDATA[ <blockquote>
 Com relação ao CTRL + F5 você vai concordar que "teoricamente" terá que funcionar, já que temos um "OR" (event.keyCode == 116 || ...) e que nesse caso se algo vier acompanhado da tecla "F5" returna true, mantendo a sessão.

Você não concorda ?

Repare nesse trecho a idéia é a mesma.
if((event.ctrlKey || event.altKey) && event.keyCode == 115) return reloaded = false;

Ou seja o F4 veio acompanhado de ctrl ou alt... é sair mesmo! 
&nbsp;
		</blockquote>

Opss falha minha...vc ta certo... :lol: 

vlw]]></description>
				<guid isPermaLink="true">http://forum.mentaframework.org/posts/list/1503.page#13419</guid>
				<link>http://forum.mentaframework.org/posts/list/1503.page#13419</link>
				<pubDate><![CDATA[Wed, 28 Nov 2007 15:53:32]]> GMT</pubDate>
				<author><![CDATA[ leonardo.pinho]]></author>
			</item>
			<item>
				<title>25) Controle de usuários (HttpSessionAttributeListener, JavaScript e MentaAjax)</title>
				<description><![CDATA[ Funciona com Java 1.4?]]></description>
				<guid isPermaLink="true">http://forum.mentaframework.org/posts/list/1503.page#13643</guid>
				<link>http://forum.mentaframework.org/posts/list/1503.page#13643</link>
				<pubDate><![CDATA[Wed, 19 Dec 2007 04:27:23]]> GMT</pubDate>
				<author><![CDATA[ bbetto]]></author>
			</item>
			<item>
				<title>Re:25) Controle de usuários (HttpSessionAttributeListener, JavaScript e MentaAjax)</title>
				<description><![CDATA[ Cara se não estou eu fiz isso no 1.4  :D]]></description>
				<guid isPermaLink="true">http://forum.mentaframework.org/posts/list/1503.page#13645</guid>
				<link>http://forum.mentaframework.org/posts/list/1503.page#13645</link>
				<pubDate><![CDATA[Wed, 19 Dec 2007 05:11:42]]> GMT</pubDate>
				<author><![CDATA[ IceW0lf]]></author>
			</item>
			<item>
				<title>Re:25) Controle de usuários (HttpSessionAttributeListener, JavaScript e MentaAjax)</title>
				<description><![CDATA[ Pessoal coloquei este codigo no meu jsp, mas agora tudo que é link que eu clico dar Logout, oque pode ser?
Tenho os meus a hef com a action ai dar logout oque pode ser?

segue codigo<span class="genmed"><b>Code:</b></span><br>
		<div style="overflow: auto; width: 100%;">
		<pre>
			var reloaded = false;
			 function verify&#40;event&#41; {
			 
			 	alert&#40;"event.ctrlKey " + event.ctrlKey&#41;;
			 	alert&#40;"event.altKey " + event.altKey&#41;;
			 	alert&#40;"event.keyCode " + event.keyCode&#41;;
			 
			 	// CTRL + F4 ou ALT + F4		 	
			 	if&#40;&#40;event.ctrlKey || event.altKey&#41; && event.keyCode == 115&#41;{
			 		reloaded = false;
			 		alert&#40;reloaded&#41;;
			 		return reloaded;
			 	}
			 
				// F5 e CTRL + R
				if&#40;event.keyCode == 116 || &#40;event.ctrlKey && event.keyCode == 82&#41;&#41;{
					reloaded = true;
					alert&#40;reloaded&#41;;
					return reloaded; 
				}
			 }
			 
			 function closeWindow&#40;&#41; {
			 	if&#40;!reloaded&#41; {
			 		alert&#40;"Close " + reloaded&#41;;
			 	 	var req = new mtw.request&#40;&#41;;
			 	 	req.setUrl&#40;"&lt;mtw:contextPath/&gt;/Logout.mtw"&#41;;
			 	 	req.onSuccess&#40;true&#41;;
			 	 	req.send&#40;&#41;;
			 	}
			 }
			 
			 //
			 // Event listeners
			 //
			 if&#40;document.addEventListener&#41; {
			 	alert&#40;"document.addEventListener"&#41;;
			 	reloaded = true;
			 	Event.observe&#40;document, 'mousemove', function&#40;&#41;{reloaded=false;}, false&#41;;		
			 }
			 
			 Event.observe&#40;document, 'keydown', verify, false&#41;;
			 Event.observe&#40;window, 'beforeunload', closeWindow, false&#41;;	</pre>
		</div>]]></description>
				<guid isPermaLink="true">http://forum.mentaframework.org/posts/list/1503.page#13658</guid>
				<link>http://forum.mentaframework.org/posts/list/1503.page#13658</link>
				<pubDate><![CDATA[Wed, 19 Dec 2007 13:59:10]]> GMT</pubDate>
				<author><![CDATA[ aorocha]]></author>
			</item>
			<item>
				<title>Re:25) Controle de usuários (HttpSessionAttributeListener, JavaScript e MentaAjax)</title>
				<description><![CDATA[ <span style="font-size: 18px; line-height: normal"><b>Aos que estão acompanhando este "caso de uso".</b></span>

<span style="font-size: 15px; line-height: normal"><font color='red'>Devido a grande procura, duvidas, sugestões e problemas encontrados com relação à este script em geral.

Eu e o Diego estamos tentando corrigir os problemas e ele está finalizando um framework JS (desenvolvido por ele) que será responsável, entre outras coisas, manter este "caso de uso". 

Assim que o framework estiver pronto estaremos disponibilizando exemplos, os arquivos para download, e sites para dúvidas, etc.

Abraço a todos.</font></span>]]></description>
				<guid isPermaLink="true">http://forum.mentaframework.org/posts/list/1503.page#14418</guid>
				<link>http://forum.mentaframework.org/posts/list/1503.page#14418</link>
				<pubDate><![CDATA[Fri, 15 Feb 2008 11:10:50]]> GMT</pubDate>
				<author><![CDATA[ IceW0lf]]></author>
			</item>
			<item>
				<title>Re:25) Controle de usuários (HttpSessionAttributeListener, JavaScript e MentaAjax)</title>
				<description><![CDATA[ <font color='blue'>A TODOS QUE ESPERAM ANCIOSAMENTE A SOLUÇÃO DESTE PROBLEMA, SEGUE O LINK DO WST.

Um framework JavaScript que reúne métodos que visam o aperfeiçoamento e a padronização de outros métodos webstandards de modo simples. 

Dentre suas ferramentas, podemos destacar 3 classes principais: 
- wst.Browser --> Responsável por nos passar as principais informações sobre a plataforma do usuário (IE, FF, ETC);
- wst.formValidator -->  O validador de formulários;
- wst.windowControl --> Uma classe para controle de janela e sessões.

Para conhecer o framework segue os links:

Site oficial: http://www.wstframework.org/
SourceForge: http://www.sourceforge.net/projects/wstframework</font>]]></description>
				<guid isPermaLink="true">http://forum.mentaframework.org/posts/list/1503.page#15198</guid>
				<link>http://forum.mentaframework.org/posts/list/1503.page#15198</link>
				<pubDate><![CDATA[Wed, 23 Apr 2008 14:35:21]]> GMT</pubDate>
				<author><![CDATA[ IceW0lf]]></author>
			</item>
	</channel>
</rss>
