Может ли веб-приложение Java получить доступ к устройству чтения смарт-карт на удаленной рабочей станции?

Я работаю над некоторыми новыми функциями для одного из наших существующих веб-приложений на основе Java. Само веб-приложение размещено на одном из наших внутренних серверов и доступно через браузер на нескольких компьютерных терминалах нашего предприятия. Приложение предназначено для проведения проверок качества на разных этапах нашего производственного процесса. В настоящее время пользователи должны войти в систему вручную, выбрав свое имя пользователя из раскрывающегося списка и введя свой пароль перед проведением каждой проверки качества. Чтобы ускорить процесс, меня попросили ввести чтение смарт-карты для входа в систему.

Я написал служебный класс, используя javax.smartcardio, и я могу получить доступ к терминалу устройства чтения карт USB, подключенному к моему ноутбуку, прочитать ATR с карты и использовать информацию для входа в приложение, когда я запускаю приложение на локальном компьютере. сервер Tomcat7. Итак, на моей локальной машине все отлично работает.

К сожалению, после развертывания приложения на нашем веб-сервере я больше не могу обнаружить терминал чтения карт, поскольку считаю, что веб-приложение Java на самом деле ищет устройство чтения на компьютере, на котором оно развернуто.

Можно ли каким-либо образом получить доступ к своему java-коду для считывания карт, подключенного к удаленной рабочей станции, через взаимодействие с браузером?

Веб-приложение написано на GWT, и я использую вызовы RPC для доступа к внутреннему коду серверной части. Любая помощь очень ценится. Код устройства чтения карт довольно прост, поэтому я опубликую его, если это поможет:

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