Isolamento de cliente

Pessoal, estou com uma dúvida forte aqui… Sou iniciante em aplicações web usando Servlet.

É o seguinte: Desenvolvemos um sistema web onde os clientes possuem leitoras de smart cards (manipuladas por applets no browser) e os servlets servem para enviar ao apple os comandos de conexão com estas leitoras.
Muito bem, mas eu só devo permitir que um pc possua no máximo uma conexão com o servidor, para não confundir a leitora, pois segue uma sequencia de comandos. Um exemplo disso é se o cliente abrir o sistemas em duas janelas de browser. Ambas serão sessões diferentes, mas exibirão a mesma leitora. Eu quero é não permitir isso; quando já houver uma sessão aberta com este pc, na tentativa de abertura da segunda o servlet já avisar que não será possível.

Pensei em classificar por IP, mas se dois computadores distintos estiverem atrás do mesmo proxy, acredito que não distinguirá os dois e bloqueará o segundo injustamente (apenas acho, gostaria de saber se estou certo).
Pensei em classificar por endereço MAC ou identificador do CPU, mas o Java não suporta isso em alto nível, e eu teria que utilizar JNI ou algo que dependesse do Sistema Operacional, o que não é desejado.

Entendo que este problema não é incomum e muitos já devem saber uma solução mais adequada e robusta… Se alguém tiver algo, ou uma opinião a respeito, serei muito grato…

Muito obrigado

http://forum.java.sun.com/thread.jspa?threadID=615562&messageID=3424234

mac address sem jni

Valeu cara… Mas a solução que tá lá é dependente de Sistema Operacional, no caso o Windows…

Neste fórum tem um post dizendo as condições pra obter o MAC:

  1. The client and server must be on a lan (not different lans, not a wan, not the internet.)
  2. You must use OS specific code - the Java API does not have anything that will do this.

O que me faz tender a não usar o MAC…

Mas agradeço pela contribuição
Abraço

Se sua solução puder usar Java 6.0 existe uma nova classe que permite obter o MAC Address, no pacote java.net.*

Amigo, obrigado pela dica!
É a classe java.net.NetworkInterfaces e ela recupera todas as interfaces de rede do pc, e cada interface tem seu “endereço de hardware” que no caso é o MAC.

Estou a utilizando e deu certo. Valeu!

Entretanto, ainda passo por uma dificuldade:
Esta classe recupera as interfaces de rede, mas eu preciso recuperar justamente a interface que está sendo utilizada pela conexão com o servlet.
É possível obter a interface a partir do endereço IP da conexão, ou o nome da interface, mas eu não estou conseguindo obter este IP ou nome de uma forma automática… Estou escolhendo a interface “manualmente”, mas ela deve ser identificada programaticamente. No caso, passo o nome “eth0”, mas não posso assumir que qualquer cliente utilize este nome…

No meu applet utilizo as classes URL e URLConnection para a conexão com o servlet. Procurei mas não achei uma forma destas me retornarem o endereço IP da interface local utilizada na conexão, apenas possuem informações sobre os endereços do servlet…
Alguém sabe como obter o endereço IP da interface local utilizada na conexão??

Eu já tentei utilizar “127.0.0.1”, mas este endereço é relacionado a outra interface, chamada “lo” e que não é relacionada à interface da conexão com o servlet, mas tipo um endereço interno.

Muito grato mesmo
Abraço

Dica:

  • Se você achar “eth0”, use-a porque é o endereço da primeira placa de rede, em ambiente Windows (e acho que no Linux também). Como você quer identificar o cliente (esse é seu objetivo), mesmo que a placa não seja usada, você quer na verdade um identificador único, e no seu caso o MAC dessa placa, mesmo que não seja usada, é excelente para esses funs.
    Em ambiente Solaris, infelizmente o nome da interface quase nunca é “eth0” e depende do nome do driver da placa de rede. Mas com certeza nunca será “lo” alguma coisa porque em Solaris “lo alguma coisa” é só para loopback.
  • Não use as interfaces “lo” alguma coisa, porque são “loopback” e o MAC é fixado.
  • Não sei qual é o nome da interface quando você tem uma conexão dial-up (discada, ou usando algum modem esquisito como o do serviço Giro da Embratel). Mas se a conexão for dial-up o MAC também é fixado.

O que você me disse falou tudo o que eu precisava. O nosso sistema utiliza dispositivos que geralmente só possuem drivers para Windows e Linux.

Com isso, este problema já está resolvido. Agradeço muito a colaboração de todos! :slight_smile:
Se alguém precisar de algo relacionado ao projeto que trabalho, pode entrar em contato.

E se o usuário tirar o smart card e espetar em outra máquina (com outra leitora). Será que vc não precisa de uma sessão por usuário? Vc pode controlar isso usando as interfaces da API JAAS. Aliás, ela é a mais apropriada para se trabalhar com múltiplos dispositivos de autenticação como smart cards ou sensores biométricos.