Kann eine Java-Webanwendung auf einen Smartcard-Leser auf einer Remote-Workstation zugreifen?

Ich arbeite an einigen neuen Funktionen für eine unserer vorhandenen Java-basierten Webanwendungen. Die Web-App selbst wird auf einem unserer internen Server gehostet und kann über den Browser an mehreren Computerterminals in unserer Einrichtung abgerufen werden. Die Anwendung dient zur Durchführung von Qualitätsprüfungen in verschiedenen Phasen unseres Produktionsprozesses. Derzeit müssen sich Benutzer manuell anmelden, indem sie ihren Benutzernamen aus einer Dropdown-Liste auswählen und ihr Kennwort eingeben, bevor sie eine Qualitätsprüfung durchführen. Um den Vorgang zu beschleunigen, wurde ich gebeten, das Lesen einer Smartcard für die Anmeldung zu implementieren.

Ich habe eine Utility-Klasse mit javax.smartcardio geschrieben und kann auf das an meinem Laptop angeschlossene USB-Kartenlesegerät zugreifen, die ATR von der Karte lesen und mich mit den Informationen bei der Anwendung anmelden, wenn ich die Anwendung auf meinem Computer ausführe lokaler tomcat7 server. Auf meinem lokalen Computer funktioniert also alles hervorragend.

Leider kann ich das Kartenleseterminal nicht mehr erkennen, wenn ich die Anwendung auf unserem Webserver implementiere, da ich glaube, dass die Java-Webanwendung tatsächlich nach dem Reader auf dem Computer sucht, auf dem sie implementiert ist.

Gibt es eine Möglichkeit, wie ich meinen Java-Code über die Interaktion mit dem Browser auf einen an einer Remote-Workstation angeschlossenen Kartenleser zugreifen lassen kann?

Die Web-App ist in GWT geschrieben, und ich verwende RPC-Aufrufe, um auf den serverseitigen Back-End-Code zuzugreifen. Jede Hilfe wird sehr geschätzt. Der Code für den Kartenleser ist recht einfach. Ich werde ihn posten, wenn das hilft:

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage