首页 > 解决方案 > 从浏览器访问 USB 智能卡数据

问题描述

我正在构建一个基于企业浏览器的应用程序,该应用程序可以在带有触摸屏的专用 PC 上运行(可以将其视为 Kiosk)。因此,应用程序本身是基于 NodeJS 构建的,用户在浏览器上做出选择并插入他们的智能卡。由于 JavaScript 不能直接读取和解密 Smart Card 数据,因此在这台 PC 上运行的 Java 程序会检测到插入的 Smart Card 并读取数据。现在,问题是将此智能卡详细信息(名称、地址等)发送到 JS 代码。我不太确定如何解决这个问题,以下是一些想法:

  1. Java 智能卡阅读器在读取数据后,将其作为键盘输入输出。然后 JS 代码监听这个特定的键盘事件并读取所有数据。有点像条形码扫描仪的工作原理。
  2. Java 智能卡读卡器和浏览器连接到云并建立了 WebSocket 通道。Java程序读取数据后,推送到云服务器,云服务器再通过WebSockets推送到浏览器。
  3. 将 Java 智能卡读卡器作为具有自签名 SSL 证书的 Web 服务器 (localhost) 运行。在 hosts 文件中为服务器添加本地域名。现在,浏览器可以通过 Http API 直接与 Java 网络服务器对话。
  4. 使用 gRPC (localhost) 运行 Java 智能卡读卡器,并通过 gRPC-web 将浏览器连接到它。(我在 gRPC 方面没有经验,但也许这是可能的?)

以上每一个都有自己的陷阱。我不确定其他基于 Kiosk 的系统是如何工作的,因此对上述想法的任何建议或改进都会很棒。

标签: javascriptjavausbsmartcardkiosk

解决方案


The best solution here would probably be to host a WebSocket using Jetty in your java application at 127.0.0.1 and have your javascript connect to that directly. No cloud server would be needed as WebSockets aren't bound to the same origin policy or cross origin resource sharing.

Another potential solution is to have an embedded browser in your java program using javafx's webkit or other java browser implementation and share data through that. This is less than ideal because javafx's webkit has it's own weird quirks and commercial embedded browsers for java cost thousands.

I would use the websocket solution.


推荐阅读