MATAR SESSÃO DO USUÁRIO. (IGUAL SCRIPTCASE) - RESOLVIDO

Pessoal bom dia.
Tenho um sistema em que preciso determinar o tempo de uma sessão do usuário, por exemplo 60 minutos do último acesso a qualquer aplicação do sistema.
Então em cada aplicação que o usuário acessar ele daria um update em uma tabela genérica por exemplo, “update colaborador set ultimo_acesso = now() where id_colaborador = x;”
Só que de repente eu preciso matar a sessão dele em UM MINUTO… o que faria EXEMPLO… “update colaborador set ultimo_acesso = now()+59 where id_colaborador = x;”.
Até sem surpresa… agora como eu faria essa verificação ? O que pensei… colocar algum processamento em ajax (sei lá) no MENU que sempre está ativo na tela… e por trás dele ficar verificando essa tabela… e se estiver EXPIRADO a sessão, eu já faço o logoff igual o SISTEMA do SCRIPTCASE… em que se ficar na tela por muito tempo, alterar algo, ele já me mandar pra tela de logon novamente.

Alguém tem uma sugestão de funcionamento ou o scriptcase tem alguma solução.
Obrigado.

Alguma sugestão ?

Não sei se entendi, mas seria algo assim:

https://v9.infinitusweb.com.br/forum_sc/useronline_login/

Aroldo boa tarde.
Como sempre… afinado com o scriptcase…
É exatamente o que eu preciso fazer…
Mas vc entendeu o meu caso… ele teria que ficar rodando no MENU, pois é o único que não muda… quando se clica nas opções de menu… e a cada página acessada ele vai atualizando…
É bem parecido com seu exemplo, porém no meu caso ele vai atualizando o 60 minutos em todas as páginas que entrar entendeu…
Aquele refresh que vc vc colocou na consulta né… como colocaria no menu ?

Peço desculpas por errar seu nome…
Haroldo.

Vou tentar explicar:

No menu tenho um código javascript temporizador, que a cada n segundos executa um script ajax:

Evento onApplicationInit:

script>
function redir (check) {
	
	if (check==1) { 
		
	$(window.document.location).attr('href','../useronline_login/useronline_login.php');
	
	}
	
	//if (check==2) { 
	//	alert('Sua Sessão expirou, feche suas telas e refaça o login.');
	//}
    
	}
	
setInterval(function(){
	$.post('../useronline_set/useronline_set.php')
	
	.done(function( data ) {
    	redir(data);
  	});
	
}, 15000);
	
setInterval(function() {

	var vTime = new Date ( );
  	var vH = vTime.getHours ( );
  	var vM = vTime.getMinutes ( );
  	var vS = vTime.getSeconds ( );

	vH=vH<10?'0'+vH:vH;
	vM=vM<10?'0'+vM:vM;
	vS=vS<10?'0'+vS:vS;
  	//alert(vH+':'+vM+':'+vS);
   	$("#clock").html(vH+':'+vM+':'+vS);
	
}, 1000);	

</script>

<?php

O método redir: aborta o sistema redirecionando para o menu
O método setInterval $.post: Executa uma app blank via ajax a cada segundo.
O método setInterval seguinte: frescura, apenas escreve a hora no cabeçalho do menu

Evento onExecute:

sc_include_library('sys', 'GlobalClass', 'inc/Config.inc.php');
$g=new GlobalVars('useronline');

if ($g->get('Expirou') && ({sc_script_name} <> 'useronline_login')) {
  
	sc_redir(useronline_set);

}
else {
	[USUARIO]=$g->get('User');
	if ($g->get('ControlSess')):
		$g->set('TimeExpire',time()+$g->get('TimeSess'));
	endif;
}

A cada clique em um item do menu, se a sessão não expirou e eu não cliquei em Sair é executado a app blank useronline_set
Ou seja enquanto o usuário está interagindo com o menu ele esta ganhando mais segundos de vida (determinados na horado login)

esse código é a forma que eu gravo meus valores em sessão -->
sc_include_library(‘sys’, ‘GlobalClass’, ‘inc/Config.inc.php’);
$g=new GlobalVars(‘useronline’);
<— esse código é a forma que eu gravo meus valores em sessão, nada de mais (pode usar $_SESSION).

Aplicação Blank useronline_set:

Evento onExecute:

sc_include_library('sys', 'GlobalClass', 'inc/Config.inc.php');
$g=new GlobalVars('useronline');

if ($g->get('Expirou')):
	echo "<H1> Sr(a) {$g->get('User')}.</H1><hr>
	<br><br><h2 style=Color:Red><p> Sua sessão expirou. 
	Salve todos seus dados e refaça seu login.</p></h2>";
	die();
endif;



if ($g->get('ControlSess') && $g->get('TimeExpire') < time()):
	if ($g->get('AutoAbort')):
		echo 1;
	else:
 		$g->set('Expirou',1);
		echo 2;
	endif;
else:
	AtualizaUsuario(clone($g));
	echo False;
endif;

Se expirou dou mensagem, ou seja, dentro de uma aplicação chamada no menu se o usuário para de interagir com a aplicação pelos N segundos informados no login, a aplicação aborta, com a possibilidade de salvar os dados antes de abortar.

Se a hora de expirar for menor que a hora atual envia ao javascript o comando para abortar o sistema (lembra que o menu chamar essa blank por ajax a cada segundo).

caso contrário executa o método: AtualizaUsuario(). o comando php clone , faz uma clonagem de um objeto criando um novo handler mas com os mesmos valores.

Método AtualizaUsuario():

if ($g->get('User')):
	$_sel="Select count(*) from users_online where login='".$g->get('User')."'";
	sc_lookup(ds,$_sel);
	if ($ds[0][0]>0):
  		$_sql="Update users_online set Data_Hora=now() where Login='".$g->get('User')."'";
	else:
  		$_sql="Insert into  users_online (login) value ('".$g->get('User')."')";
	endif;

	sc_exec_sql($_sql);
	sc_commit_trans();

endif;

Para gerenciar os usuários logados temos uma tabela com engine tipo Memory onde salvamos a hora atual para este usuário. Como a tabela é em memória o processo se torna ultra rápido.

A consulta como aplicação inicial do menu acessa essa tabela cujo o refresh está a cada 10 segundos, para apenas poder mostrar os usuários que estão online ou não comparando a hora atual com a hora da última iteração do usuário com o sistema.

Nas aplicações do sistema:

Onload:

$g=new GlobalVars('useronline');

if ($g->get('ControlSess')  && !$g->get('Expirou') ):

	echo "Controla Sessão e Não Expirou<br>";
	$g->set('TimeExpire',time()+$g->get('TimeSess'));
	$dif=$g->get('TimeExpire')-time();
	echo "seu tempo de sessão foi renovado em {$dif} segundos";

elseif($g->get('Expirou')):

    echo "<span style=color:red>SEU TEMPO DE SESSÃO EXPIROU.<br>SALVE SEUS DADOS E REFAÇA SEU LOGIN.</span>";

endif;

Compara a hora da última iteração com a hora atual e alerta o usuário para salvar os dados. Isso se no login não pedir para forçar a saída desviando para o login.

no evento onvalidadesucess:

$g=new GlobalVars('useronline');

if($g->get('Expirou')):
    sc_redir(useronline_login,'','_parent');
endif;

Depois que o usuário salvou os dados em tela aborta o sistema. Hoje não faria assim, tem formas de capturar o uso do mouse em toda aárea do browser, mas como esse meu código é bastante antigo não aprimorei ele ainda.

TAGS: Haroldo, Controlando Usuários On-line, Sessão, Expiração

Haroldo, dando uma lida rápida, não consegui compreender tão fácil… mas vou fazer aqui do meu jeito utilizando parte do seu código e te informo novamente… dando um feedback
Muito obrigado pelo seu auxilio.

Realmente é um código mais avançado, mas resumindo.

O menu fica chamando uma app blank que fica gravando a hora atual para o usuário logado em uma tabela a cada n segundos.
A cada interação do usuário com o sistema eu tenho a hora de iteração, eu fico comparando esses tempos para saber se expirou a sessão.

1 Curtida

Uma consulta Haroldo onde consigo esta liberia

To tentando aplicar tua segestao na minha aplicacao

<?php

function  autoload($Class) {
	$iDir= null;

	//if(file_exists("../_lib/lib/php/{$Class}.php") ):
  // 		include_once("../_lib/lib/php/{$Class}.php");
//	    $iDir = true;
 // 	endif;
	
//	if (!$iDir):

	    if(isset($path_lib_php)) 	$cDir[] =$path_lib_php;
		if(isset($path_libs)) 		$cDir[] =$path_libs;
	   	$cDir[] = '../_lib/libraries/sys/GlobalClass/class';
  	 	$cDir[] = '../_lib/libraries/grp/GlobalClass/class';	
  	 	$cDir[] = '.';

   		foreach ($cDir as $dirname):
			$file="{$dirname}/{$Class}.class.php";
	//echo "<hr>".$file;
	   		if(!$iDir && file_exists($file) && !is_dir($file) ):
      			include_once($file);
	    	    $iDir = true;
				Break;
   			endif;
		endforeach;
	
//	endif;
	
	if (!$iDir):
		trigger_error("Arquivo da classe não encontrado : {$Class}.class.php", E_USER_ERROR);
	endif;
	
}

spl_autoload_register("autoload");
?>

@InfinitusWeb , desculpe-me a leiguice.

Estou tentando implementar sua solução, mas estou em duvida de como funciona e obtendo um erro no “new GlobalVars(‘useronline’);”
Ao executar em minha aplicação, está me retornando um erro “Arquivo da classe não encontrado : GlobalVars.class.php”.
Esse arquivo de classe, é um arquivo que devo ter na biblioteca externa, ou é uma classe ‘virtual’?

Desde já, muito obrigado pela colaboração aqui no fórum!!

1 Curtida

GlobalVars.class.php é uma bib externa, mas vc pode no lugar dela usar globais do próprio Scriptcase. Eu criei essa classe porque uma época as globais do SC não estavam funcionando corretamente.

De qualquer forma segue ela aqui:

<?php

/**
 * GlobalVars.class [ Globais ]
 * Cria Variaveis globais para uso compartilhado entre aplicações
 * @CopyRight (C) 2009, Haroldo Passos (InfinitusWeb)
 */
class GlobalVars {

   protected $Id;

   function __construct($_id) {
      $this->Id = strtolower($_id);
	  if (!isset($_SESSION[$this->Id])):
	   	$_SESSION[$this->Id]=Array();
	  endif;
   }
	
   public static function setId($_id) {
      $this->Id = strtolower($_id);
	  if (!isset($_SESSION[$this->Id])):
	   	$_SESSION[$this->Id]=Array();
	  endif;
   }

   public  function  set(string $name, $value=NULL) {
      $_SESSION[$this->Id][strtolower($name)] = $value;
   }

   public  function get(string $name) {
	if(isset($_SESSION[$this->Id][strtolower($name)])):
      	return $_SESSION[$this->Id][strtolower($name)];
	else:
	   	return NULL;
	endif;
   }
	
	public  function dump(string $name) {
		if(isset($_SESSION[$this->Id][strtolower($name)])):
      		return "<pre>".print_r(array($this->Id => $_SESSION[$this->Id] ),true)."</pre>";
		else:
	 	  	return "VAZIO";
		endif;
   }
	public  function del(string $name=NULL) {
		if ($name):
			unset($_SESSION[$this->Id][strtolower($name)]);
		else:
			unset($_SESSION[$this->Id]);
		endif;
  	}

}

Exemplo:

TAGS: HAROLDO, CONTROLE, SESSÃO, USUÁRIOS, ONLINE

1 Curtida