我正在为我们现有的基于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的智能卡外壳 但是我不能用它来读任何读卡器。我想知道它是否有兼容性问题。 请我知道我可能不恰当地提出了这个问题,但是请那里的任何人帮助我。 任何相关的链接或有用的信息都可以帮助我入门