Um aplicativo da Web Java pode acessar um leitor de cartão inteligente em uma estação de trabalho remota?

Estou trabalhando em algumas novas funcionalidades para um dos nossos aplicativos web baseados em Java existentes. O aplicativo da Web em si está hospedado em um de nossos servidores internos e pode ser acessado através do navegador em vários terminais de computadores em nossas instalações. O aplicativo é para a realização de verificações de qualidade em várias etapas do nosso processo de produção. Atualmente, os usuários precisam fazer login manualmente, selecionando seu nome de usuário em uma lista suspensa e digitando sua senha antes de realizar cada verificação de qualidade. Para acelerar o processo, fui solicitado a implementar a leitura de um cartão inteligente para login.

Eu escrevi uma classe de utilitário usando javax.smartcardio e posso acessar o terminal do leitor de cartão USB conectado ao meu laptop, ler o ATR do cartão e usar as informações para fazer login no aplicativo quando estou executando o aplicativo no meu local servidor tomcat7. Então, na minha máquina local, tudo funciona muito bem.

Infelizmente, depois de implantar o aplicativo em nosso servidor da web, não consigo mais detectar o terminal do leitor de cartão, pois acredito que o aplicativo da web Java está realmente procurando o leitor na máquina na qual está implantado.

Existe alguma maneira de que meu código java acesse um leitor de cartão conectado a uma estação de trabalho remota por meio da interação com o navegador?

O aplicativo Web está escrito em GWT e estou usando chamadas RPC para acessar o código do lado do servidor back-end. Qualquer ajuda é muito apreciada. O código do leitor de cartões é bastante simples, então eu o publicarei se isso ajudar:

import java.util.List;

import javax.smartcardio.Card;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.TerminalFactory;

public class SwipeCardUtil 
{

    private static org.apache.log4j.Logger LOGGER  = org.apache.log4j.Logger.getLogger("hwslqc");

    /**
     * @return ATR
     */
    public static String readCardATR()
    {
        String ATR = "";
        try 
        {
            // Show the list of available terminals
            TerminalFactory factory = TerminalFactory.getDefault();

            List<CardTerminal> terminals = factory.terminals().list();
            if (terminals.size() == 0) 
            {
                LOGGER.error("No Swipe Card Terminals Found");
                return null;
            }

            //System.out.println("Terminal: " + terminals.get(0).getName());
            // Get the first terminal in the list
            CardTerminal terminal = terminals.get(0);

            if(terminal.isCardPresent())
            {
                // Establish a connection with the card using
                // "T=0", "T=1", "T=CL" or "*"
                Card theCard = terminal.connect("*");

                // Get ATR
                byte[] baATR = theCard.getATR().getBytes();
                ATR = SwipeCardUtil.byteArrayToHexString(baATR);
                //System.out.println("ATR: " + ATR);
                // Disconnect
                // true: reset the card after disconnecting card.
                theCard.disconnect(true);
             }
            else{
                 return null;
             }

        } 
        catch (Exception ex) {
            LOGGER.error("No Card Reader Connected. Please connect a Card Reader and try again. "+ex.toString());
            ex.printStackTrace();
        }
        return ATR;
    }

    /**
     * @param theBytes
     * @return theByteArray as a hex string
     */
    public static String byteArrayToHexString(byte[] theBytes)          
    {             
        StringBuffer sb = new StringBuffer(theBytes.length * 2);             

        for (int i = 0; i < theBytes.length; i++) 
        {               
            int byteToRead = theBytes[i] & 0xff;               
            if (byteToRead < 16) 
            {                 
                sb.append('0');               
            }               
            sb.append(Integer.toHexString(byteToRead));          
        }             
        return sb.toString().toUpperCase();          
     }
}