2014-12-02 64 views
0

最近我问社区一个问题:Can a Java Web Application access a Smart card reader on a remote work station?如何阻止我的小程序刷新我的GWT页面?

从我收到的答案中,我决定写一个Applet来尝试完成这个。也就是说,我需要能够从GWT应用程序中运行Applet,以便我可以访问远程工作站上的读卡器,并使用从ID卡读取的信息授予用户访问应用程序的某些部分的权限。根据我在this question的第四个答案中找到的建议,我将Applet编写为一个完全独立的Java项目,将其导出为.jar并使用jarsigner用我的证书签名。我能够验证jar并且它被正确地签名。为了测试已签名的jar/Applet的工作原理,我编写了一个简单的HTML页面,其中只有applet标签,并将其放在我们的Tomcat 7 Web服务器的htdocs文件夹中。使用这个简单的页面,我可以访问远程工作站上的读卡器并阅读我需要的信息。

Hooray。所以,从我上面提到的第二个问题,建议继续,我试图用JNLP使用下面的GWT代码,启动小程序:

HTML swipeCard = new HTML(); 
    String appletHTML = "<applet code=\"main/java/com/prusa/swipeCardApplet/SwipeCardApplet.class\" height=\"200\" width=\"200\">"+ 
           "<param name=\"jnlp_href\" value=\"swipeCardApplet.jnlp\">"+ 
         "</applet>"; 
    swipeCard.setHTML(appletHTML); 
    this._swipeCardLogin.add(swipeCard); 
    this._swipeCardLogin.setVisible(true); 

我的JNLP文件看起来像:

<?xml version="1.0" encoding="UTF-8"?> 
<jnlp href="swipeCardApplet.jnlp">  
    <information> 
     <title>Swipe Card Applet</title> 
     <vendor>pramericas.com</vendor> 
    </information> 
    <resources>   
     <j2se version="1.6+" />     
     <jar href="WEB-INF/lib/swipeCardApplet-1.0.0.jar" main="true" />  
    </resources>  
    <applet-desc   
     name="SwipeCardApplet"   
     main-class="main/java/com/prusa/swipeCardApplet/SwipeCardApplet.class"   
     width="200"   
     height="200">  
    </applet-desc>  
    <security>   
     <all-permissions />  
    </security> 
</jnlp> 

这是我的问题:在IE9中,当我将小程序标记添加到我的GWT应用程序中,并导航到包含它的页面时,小程序简要显示为空白,IE警告在页面底部闪烁(太快阅读),然后页面刷新回应用程序的主屏幕。

在Chrome中,我收到一个提示,声明我的java版本已过期(它是),可以选择“运行这次”。当我选择这次运行时,我会得到一个Java Authentication Required弹出窗口,要求输入用户名和密码来访问服务器上的应用程序。我输入我的凭据并单击确定。这导致applet显示“Error。Click for details”消息。这给了我如下:

Java Plug-in 1.6.0_21 
Using JRE version 1.6.0_21-b07 Java HotSpot(TM) Client VM 
User home directory = C:\Users\SWESTF01 
---------------------------------------------------- 
c: clear console window 
f: finalize objects on finalization queue 
g: garbage collect 
h: display this help message 
l: dump classloader list 
m: print memory usage 
o: trigger logging 
q: hide console 
r: reload policy configuration 
s: dump system and deployment properties 
t: dump thread list 
v: dump thread stack 
x: clear classloader cache 
0-5: set trace level to <n> 
---------------------------------------------------- 


exception: Unable to load resource: https://dev.pramericas.com/hwslqc/WEB-INF/lib/swipeCardApplet-1.0.0.jar. 
com.sun.deploy.net.FailedDownloadException: Unable to load resource: https://dev.pramericas.com/hwslqc/WEB-INF/lib/swipeCardApplet-1.0.0.jar 
    at com.sun.deploy.net.DownloadEngine.actionDownload(Unknown Source) 
    at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source) 
    at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source) 
    at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source) 
    at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source) 
    at com.sun.deploy.net.DownloadEngine.getResource(Unknown Source) 
    at com.sun.javaws.LaunchDownload$DownloadTask.call(Unknown Source) 
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: 
java.io.FileNotFoundException: https://dev.pramericas.com/hwslqc/WEB-INF/lib/swipeCardApplet-1.0.0.jar 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source) 
    at com.sun.deploy.net.HttpUtils.followRedirects(Unknown Source) 
    at com.sun.deploy.net.BasicHttpRequest.doRequest(Unknown Source) 
    at com.sun.deploy.net.BasicHttpRequest.doRequest(Unknown Source) 
    at com.sun.deploy.net.BasicHttpRequest.doGetRequest(Unknown Source) 
    at com.sun.deploy.net.DownloadEngine.actionDownload(Unknown Source) 
    at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source) 
    at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source) 
    at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source) 
    at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source) 
    at com.sun.deploy.net.DownloadEngine.getResource(Unknown Source) 
    at com.sun.javaws.LaunchDownload$DownloadTask.call(Unknown Source) 
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Exception: com.sun.deploy.net.FailedDownloadException: Unable to load resource: https://dev.pramericas.com/hwslqc/WEB-INF/lib/swipeCardApplet-1.0.0.jar 

这只是与我使用的路径的问题,或者是其他的是我没有看到的东西吗?任何帮助或了解我做错了什么将不胜感激。

一些限制:我使用Maven与Nexus存储库将我的.jar文件作为依赖项引入。我的pom.xml文件中添加了依赖关系的正确条目。

回答

3
exception: Unable to load resource: 
    https://dev.pramericas.com/hwslqc/WEB-INF/lib/swipeCardApplet-1.0.0.jar. 

尝试使用您的浏览器对该URL进行直接访存。我敢打赌,你会看到'禁止'或类似的。 lib目录不是“公共”目录,需要将applet Jar移动到可访问的某个位置。

+0

谢谢安德鲁!我改变了路径以引用我放置在htdocs文件夹中的.jar文件的副本,以便使用简单的HTML页面进行测试。它在Chrome中工作,但不幸的是,我仍然遇到与IE9(我们的公司标准浏览器)相同的问题。有什么建议可能会导致问题在IE9中持续存在? – 2014-12-03 15:53:04

+0

我建议使用[Deployment Toolkit Script](http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/deployment_advice.html)而不是纯HTML来启动applet。 – 2014-12-04 00:10:12