Может ли веб-приложение 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();
}
}