java - Java Web 应用程序可以访问远程工作站上的智能卡读卡器吗?

标签 java gwt tomcat7 smartcard

我正在为我们现有的基于 Java 的 Web 应用程序之一开发一些新功能。该网络应用程序本身托管在我们的一台内部服务器上,可以通过我们工厂内多个计算机终端的浏览器进行访问。该应用程序用于在我们生产过程的各个阶段进行质量检查。目前,在进行每次质量检查之前,用户需要通过从下拉列表中选择用户名并输入密码来手动登录。为了加快进程,我被要求实现智能卡的读取以进行登录。

我已经使用 javax.smartcardio 编写了一个实用程序类,并且我能够访问插入笔记本电脑的 USB 读卡器终端,从卡中读取 ATR,并在运行应用程序时使用该信息登录到应用程序在我本地的 tomcat7 服务器上。因此,在我的本地计算机上,一切都运行良好。

不幸的是,一旦我将应用程序部署到 Web 服务器上,我就无法再检测到读卡器终端,因为我相信 Java Web 应用程序实际上是在部署到的计算机上寻找读卡器。

有没有什么方法可以让我的 java 代码通过与浏览器交互来访问插入远程工作站的读卡器?

Web 应用程序是用 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();          
     }
}

最佳答案

您的客户端是一个网络浏览器,您的网络应用程序部署在远程服务器上。从客户端获取阅读器数据的唯一方法是实现一个在客户端运行的软件。 有多种方法可以执行此操作,但许多方法不能在客户端的 Web 浏览器上运行。

您可以尝试实现一个小程序,但该小程序很可能没有足够的权限来访问客户端的硬件。要提升小程序权限,必须由浏览器信任的 CA 对其进行签名。这是一个相当大的努力。

另一种方法是根本不使用网络浏览器,而是实现富客户端软件。但这与之前的建议一样痛苦,因为整个产品都基于瘦客户端/网络浏览器概念。

也许您可以使用单点登录方法。如果用户使用 Windows 计算机并使用其帐户登录,您可以使用 waffle。

关于java - Java Web 应用程序可以访问远程工作站上的智能卡读卡器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26949239/

相关文章:

java - 尝试在 tomcat 中进行数据源 JNDI 查找时出现空指针异常

java - 有没有办法强制 Java VM 立即执行从 JNI 发送的异常?

java - 如何将正确的 Spring 上下文连接到我的 Cucumber 测试?

ssl - 使用新加坡 IP 时无法通过 AWS 新加坡的 8443 端口访问 tomcat

java - 在 Tomcat 上设置一个基本的 Java 选项

gwt - 更新 URL 而不刷新

gwt - 检查模块的继承链;它可能没有继承所需的模块,或者模块可能没有正确添加其源路径条目

java - 如何调整 SmartGWT 标签或 HTMLFlow 的大小以适应内容的大小?

tomcat - 这是同一个tomcat maven插件吗?

java - 在 Windows Server 2012 中为 Tomcat 7.0 设置堆大小(以 GB 为单位)