Oi turma!!!
Tenho um problema que é o seguinte:
Um usuário X logou no sistema em várias maquinas diferentes. No sistema tem uma parte de controle. Se uma máquina estiver com o painel de controle aberto, Como eu faço pra bloquear as outras máquinas, para que elas não acessem esse painel???
Alguém poderia me dar esse help??? :lol:
Você poderia criar um flag em algum lugar indicando que o painel de controle foi aberto a primeira vez. Se alguém tentar abrir em outra máquina, o sistema verifica o status desse flag, e bloqueia o acesso, e desbloqueia quando o usuário sair da tela.
Isso é meio provinciano, mas até que funciona. O problema é quando o usuário sair da tela de uma forma inesperada, como uma falta de energia, por exemplo. A tela ficará “bloqueada”, sem ninguém usando. Teria que bolar um timeout, ou coisa assim.
esse seu painel é o q? servlet? applet? desktop?
nao sei se entendi bem, mas uma ideia seria criar um metodo static e synchronized. isso garantiria o acesso unico
public static synchronized chamaPainel() {
// ... codigo do painel
}
lembrando, nao é necessário criar nenhum thread, o propria main ja é uma, no caso de Web tambem (nao tenho muita certeza do funcionamento desse codigo em ambiente web, mas deve funcionar)
ah, so para concluir, nenhum outro objeto em uma thread diferente tera acesso ao metodo, quando usuário deslogar ou sar de forma brusca (falta de luz por exemplo) o painel sera liberado.
seguindo a ideia do amigo dreamspeaker
tu poderia salvar a SESSAO que entrou no painel, e cada vez q uma outra maquina tentar entrar verificar a SESSAO, se ja tiver uma sessao registrada, tu verifica se ele ainda existe.
Bem, eu fiz o seguinte:
Criei uma tabela no meu DB, nela contendo se o usuário está com o Painel de Controle Aberto ou não.
Mas ainda estou na dúvida com relação à esse “synchronized”.
Amigo Max, poderia me explica melhor???
No caso de falta de energia (por exemplo), como ele vai apagar o dado lá no meu DB???
ele nao vai apagar o dado no DB…
o synchronized apenas diz ao JVM que
“ESSE TRECHO DO CODIGO SO POR SER EXECUTAPOR POR 1 DE CADA VEZ”
no meu exemplo anterior, eu disse pro JVM que se uma thread por vez acessa o metodo “chamaPainel” … se outra thread quizer acessar ela vai ter que esperar
Tá, tudo bem, mas eu instalei o programa na minha máquina, e uma amiga, na máquina dela. Os dois sistemas estão logados com o mesmo usuário. Se na máquina dela tem um sistema rodando e no meu tem outro, como isso vai funcionar???
Isso só funciona se uma única aplicação tiver rodando (em um servidor, por exemplo) com vários acessos ao memo tempo na mesma aplicação!, Estou errada?
No meu caso, é um sistema em cada máquina acessando um DB no servidor.
ah, mas ai fico dificil…
mas pra que tu quer bloquear o acesso??
Emendando essa ultima pergunta do max… vc quer bloquear vários acessos ao tal painel, mas… permite vários logins do mesmo usuário???
É o seguinte:
Nesse painel estão as configurações da sessão de cada usuário, e essas informações estão guardadas no DB. Agora imagina fazer alterações de várias máquinas ao mesmo tempo???
Pra vc fazer uma pesquisa, por exemplo, é simples, o sistema vai e busca as informações em uma select.
Agora pra alterar a configuração se vários usuários fizer isso ao mesmo tempo, vai dar problema…
ok…
ao invés de armazenar no BD que o usuário tal está no painel de controle… armazena que o “o painel de controle está aberto por alguém”.
Assim se ele estiver aberto, não importa quem, ele não deixa abrir novamente.
Uma flag…
[]'s
Mas se for um usuário diferente, ele pode abrir o Painel de Controle!!!, porque são outras configurações!!!
E… onde eu armazenaria essa flag?
Mas ô Patricia…
Você diz que o tal painel armazena informações da sessão do usuário, que é única, certo?
Mas, pelo que entendi, várias máquinas podem ser logadas com o mesmo usuário. Ou seja, passam a ser várias sessões para o mesmo usuário, certo?
Não tem algo conflitante, aí, não? :?
Tudo bem,
Mas mesmo que fosse um único usuário por máquina, como eu faria para impedir um “login duplo”?
Ora, com o tão falado flag. Pode ser, por exemplo, um campo lógico em alguma tabela no seu BD, relacionada ao usuário.
Quando o fulano se logar, vc seta esse campo pra true. E quando ele der logoff, para false. Se alguém tentar se logar quando o campo estiver true, vc boqueia.
Vc só teria que bolar um jeito de mudar esse flag caso aconteça algum problema, como a já citada queda de energia. Talvez uma opção de administrador, ou algo assim.
É exatamente esse o problema!
Como eu mudaria esse flag!!!
É essa a minha dúvida!
acho que voce esta se preocupando com algo que nao vai acontecer…
esses “marabarismos” para controle da tela por login e tal, so vai lhe trazer mais bugs
O Sistema não tem um usuário administrador?
Cria um programinha pra esse cara, que lista os usuários e seus status, e dá a opção dele alterar o valor desse flag.
agora, se vc acha realmente importante fazer esse controle… é simples
no acesso a tela voce recupera todos os valores, certo?
quando voce for commitar os novos valores, verifique se os dados do BANCO ainda sao IGUAIS as dados antigos que voce possui… se forem iguais, é pq niguem alterou… se nao forem… é so dar um aviso na tela do tipo
“Valores alterados por outra conexao”
simples
Então…
Veja bem a situação:
- Existem vários usuários cadastrados
- Existe um ambiente de configuração que é única para cada usuário
- Um único usuário pode efetuar logon em diversas instancias da aplicação.
- Deve-se impedir que um usuário que já esteja no Painel de Controle, altere as configurações.
Possível Solução:
- Vc cria uma tabela que loga quem está no Painel de Controle agora (o usuário)
- Na hora que alguém tentar abrir o Painel de controle, vc verifica se aquele nome de usuários está na lista.
- Se estiver na lista, vc nega a abertura das configurações.
- Caso não esteja na lista, vc permite a abertura e define neste momento que “aquele usuário” está no painel de controle, inserido-o na tabela que loga estas informações.
Acredito que isto resolve o problema apontado…
Ou então vc pode ser mais radical…
- Não importa quem seja, vc coloca uma tabela… ou arquivo de properties, seil lá que tem uma informação…
tipo travado=True ou false…
se tiver alguém no Painel de Controle travado=true e vc nega acesso, do contrário… travado=false e vc permite o acesso…
[]'s