¿Puede una aplicación web Java acceder a un lector de tarjetas inteligentes en una estación de trabajo remota?

Estoy trabajando en una nueva funcionalidad para una de nuestras aplicaciones web basadas en Java existentes. La aplicación web en sí está alojada en uno de nuestros servidores internos y se puede acceder a través del navegador en varias terminales de computadora en todas nuestras instalaciones. La aplicación es para realizar controles de calidad en varias etapas de nuestro proceso de producción. Actualmente, los usuarios deben iniciar sesión manualmente seleccionando su nombre de usuario en un menú desplegable e ingresando su contraseña antes de realizar cada control de calidad. Para acelerar el proceso, se me ha pedido que implemente la lectura de una tarjeta inteligente para iniciar sesión.

He escrito una clase de utilidad utilizando javax.smartcardio y puedo acceder al terminal del lector de tarjetas USB conectado a mi computadora portátil, leer el ATR de la tarjeta y usar la información para iniciar sesión en la aplicación cuando estoy ejecutando la aplicación en mi local servidor tomcat7. Entonces, en mi máquina local, todo funciona muy bien.

Desafortunadamente, una vez que implemento la aplicación en nuestro servidor web, ya no puedo detectar el terminal del lector de tarjetas, ya que creo que la aplicación web Java realmente está buscando el lector en la máquina en la que está implementado.

¿Hay alguna manera de que mi código java pueda acceder a un lector de tarjetas conectado a una estación de trabajo remota a través de la interacción con el navegador?

La aplicación web está escrita en GWT, y estoy usando llamadas RPC para acceder al código del lado del servidor. Cualquier ayuda es muy apreciada. El código del lector de tarjetas es bastante simple, así que lo publicaré si eso ayuda:

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();          
     }
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta