gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:16:00 27 4
gpt4 key购买 nike

我正在为我们现有的基于 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com