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…
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.
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!
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.