当前位置: 首页 > 面试题库 >

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

秦俊发
2023-03-14
问题内容

我正在为我们现有的基于Java的Web应用程序开发一些新功能。该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浏览器,并且您的Web应用程序已部署在远程服务器上。从客户端获取读取器数据的唯一方法是实现在客户端上运行的软件。有几种方法可以执行此操作,但是许多方法不能在客户端的Web浏览器上运行。

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

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

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



 类似资料:
  • 问题内容: 因此,最近我一直在使用具有一些信息的智能卡,而我想要在此处实现的目标是使用智能卡读取器通过任何Android智能手机从这些智能卡中获取此数据。我一直在使用HID OMNIKEY 3021 USB 智能卡读取器来读取这些卡(而且我知道此读取器可通过Windows应用程序与这些卡配合使用,因为我已经对此进行了亲自测试) 现在,Android提供了USB主机,只要Android智能手机支持它

  • 我是Java卡的新手,我正在做一个项目,我需要PIN安全智能卡用于医疗保健项目。我想知道的是,如果我可以加载我的Java卡应用程序在非Java智能卡(我试图避免昂贵的成本,可以选择40美元或更多/1卡)?如果可能的话,我想知道一些关于如何区分卡片并获得它们的技术细节(类型、内存、联系/非接触等)的技巧。

  • 首先,我对智能卡还比较陌生,我不知道数据是如何存储的,哪些数据在智能卡上受到保护。 我正在读我的学生身份智能卡,它有PIN码保护。我一直在用默认的windows智能卡库(winscard.lib)用C编程。 我已经成功地阅读了ATR标题,但据我所知,ATR标题包含如何与读者沟通的信息,而不是用户信息。 我试过从卡中读取二进制文件,但APDU总是返回6E 00,表示“不支持类”或“错误指令”。以下是

  • 我需要一些使用远程ejb调用的帮助。有以下设置: 背景: 一个JavaEE web应用程序(命名为app1)托管在一个古老的WAS8应用程序服务器上。应用程序为应用程序之间的通信提供至少一个(已知)远程ejb。 基础设施信息: WAS8使用java Version1.6.0运行在我公司的Intranet上的linux服务器上。WAS8是8.0.0.15nd版本。 websphere liberty

  • 我是Android SDK/API环境的新手。这是我第一次试着画一张图/图表。我尝试使用3个不同的免费库在模拟器上运行不同类型的示例代码,但布局屏幕上没有显示任何内容。logcat将重复以下消息: 当我运行与一个许可库的评估副本相关的示例代码时,问题并没有持续存在,并且图表工作了。

  • 问题内容: 我有一个IC接触式读卡器和SLE5528智能卡。想知道如何真正开始使用这些物品。 正在读取读取器,插入智能卡后看不到任何影响。 我还从http://www.openscdp.org/安装了opensmart的智能卡外壳 但是我不能用它来读任何读卡器。我想知道它是否有兼容性问题。 请我知道我可能不恰当地提出了这个问题,但是请那里的任何人帮助我。 任何相关的链接或有用的信息都可以帮助我入门