java - 7u21 更新后弹出需要身份验证的窗口

标签 java rest jersey code-signing jnlp

过去 6 个月我一直在做一个项目。对于这个项目,我有一个部署了 web 服务的 glassfish 服务器实例。在客户端,我使用的是 JavaFX2.2,它使用 Jersey(XML 请求/响应,无 JSON)通过 BASIC 身份验证执行 REST 请求。

当用户启动程序 (JWS/JNLP) 时,通常他们只需在自己制作的登录窗口中输入凭据,按下登录按钮并开始工作。但是,从 7u21 开始,由于某种原因(可能是因为 7u21 中安全性发生了变化),我得到了一个额外的 Java“需要身份验证”弹出窗口。

Authentication required pop-up

为了确保它与 Java 版本之间的兼容性问题无关,我将服务器也更新为 7u21,因此:

  • 客户端:将 java 从 7u17 更新到 7u21
  • 服务器:将 java 从 7u09 更新到 7u21,调整 glassfish asenv.bat 文件以使用新的 jdk

如果我在上面显示的“需要身份验证”窗口中点击取消按钮,程序确实会启动,但在执行请求时它运行不稳定:

java.io.IOException: stream is closed
file:/D:/NetBeansProjects/MIT_20130516/CL_KenoM/dist/CL_KenoM.jar!/GUI/cow/ListCow.fxml
  at com.sun.jersey.api.client.ClientResponse.close(ClientResponse.java:615)
  at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:570)
  at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:535)
  at com.sun.jersey.api.client.WebResource.handle(WebResource.java:696)
  at com.sun.jersey.api.client.WebResource.access$300(WebResource.java:74)
  at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:512)
  at DA.CowsClient.getCowsByUserId(CowsClient.java:96)
  at GUI.cow.ListCowController.initialize(ListCowController.java:728)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2152)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2028)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2744)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2723)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2709)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2696)
  at Classes.Context.showContentPane(Context.java:186)
  at GUI.user.ListUserController.openAddData(ListUserController.java:389)
  at GUI.user.ListUserController.access$100(ListUserController.java:55)
  at GUI.user.ListUserController$8.handle(ListUserController.java:657)
  at GUI.user.ListUserController$8.handle(ListUserController.java:652)
  at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69)
  at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217)
  at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170)
  at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38)
  at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37)
  at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
  at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
  at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
  at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35)
  at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92)
  at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53)
  at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:33)
  at javafx.event.Event.fireEvent(Event.java:171)
  at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3117)
  at javafx.scene.Scene$ClickGenerator.access$8600(Scene.java:3055)
  at javafx.scene.Scene$MouseHandler.process(Scene.java:3337)
  at javafx.scene.Scene$MouseHandler.process(Scene.java:3168)
  at javafx.scene.Scene$MouseHandler.access$1900(Scene.java:3123)
  at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1563)
  at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2265)
  at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:250)
  at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:173)
  at java.security.AccessController.doPrivileged(Native Method)
  at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:292)
  at com.sun.glass.ui.View.handleMouseEvent(View.java:528)
  at com.sun.glass.ui.View.notifyMouse(View.java:922)
  at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
  at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
  at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
  at java.lang.Thread.run(Unknown Source)

com.sun.jersey.api.client.ClientHandlerException: java.io.IOException: stream is closed

此错误在使用 GET 方法时随机发生(尚未使用 PUT 或 DELETE 进行测试),在本例中是 getCowsByUserId() 方法:

public List<Cows> getCowsByUserId(int id) throws UniformInterfaceException {
    WebResource resource = webResource;
    resource = resource.path(java.text.MessageFormat.format("cows/user/{0}", String.valueOf(id))); //this is line 96
    List<Cows> list = resource.accept(javax.ws.rs.core.MediaType.APPLICATION_XML).get(new GenericType<List<Cows>>() { });

    return list;
}

有趣的是,当我通过 Netbeans 或使用 .jar 文件而不是 .jnlp 启动程序时,一切都按预期工作(没有额外的身份验证弹出窗口,没有错误)......所以这必须做我猜是关于 Java Webstart 的?

2013 年 5 月 28 日编辑:

我通过比较 7u17 和 7u21 的 java 控制台跟踪/调试日志做了一些进一步的研究。我在 7u21 日志中注意到以下内容:

security: Trust for: http://<url>/lib/jersey-core-1.17.jar has ended: Thu Jan 01 01:00:00 CET 1970
security: Validate the certificate chain using CertPath API
security: SHA-256 finger print: <bunch of chars>
security: The certificate hasnt been expired, no need to check timestamping info
security: The CRL support is disabled
security: The OCSP support is disabled
security: This OCSP End Entity validation is disabled
security: Start comparing to jurisdiction list with this certificate
basic: Plugin2ClassLoader.getPermissions CeilingPolicy allPerms
security: JAVAWS AppPolicy Permission requested for: http://<url>/lib/jersey-core-1.17.jar

第一行没有出现在 7u17 日志中,所以它必须对 jars 进行签名吗?它为多个 jar 文件显示相同的内容。构建项目时,所有内容都使用自己制作的 keystore 进行签名,这是大问题吗?这是否意味着 JNLP 只有在使用受信任的 CA(当然不是免费的)创建的证书签名的情况下才能正常工作?

2013 年 6 月 4 日编辑:

我从 GlobalSign 给自己买了一个代码签名证书,并将其安装到我的机器上。将 PFX 证书文件转换为 Java keystore (JKS),并使用该文件对我的 jar 进行签名(在 Netbeans 中)。之后验证了 jar ,一切似乎都没问题。 然而,我更新了网络服务器上的文件,通过 JNLP 文件启动了程序,但仍然是同样的行为……绝望的时候到了!

2013 年 6 月 6 日编辑:

好吧,开始另一种方法。作为测试,我尝试使用 HTTPUrlConnection() 而不是 Jersey 来获取 XML 数据:

在使用 7u21 时执行 http GET 请求时,我会看到相同的“需要身份验证”窗口。使用 7u17 我得到了 XML 响应。仍然没有人知道可能出了什么问题?这可能与我使用 BASIC 身份验证有关吗?这可能与服务器有关吗?这可能与 JNLP 文件有关吗?我搜索这个问题的答案越多,我的问题似乎就越多:)

最佳答案

我对您的回答follow-up question也应该回答这个问题。

简而言之:Java Web Start 在 JDK7 中默认缓存 HTTP 响应,您必须在客户端请求和 Jersey REST 服务的响应中将 Cache-Control header 设置为“no-cache, no-store”。

关于java - 7u21 更新后弹出需要身份验证的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16626676/

相关文章:

java - 是否有一个jvm参数导致jvm在启动时创建一个hprof文件

javascript - 将 FormParams 与 Jersey 和 jQuery 结合使用

http - 使用 JSON 作为 API 请求参数的格式(为我的 Web 应用程序设计 API)

javascript - 批量 REST API POST 处理

java - OpenSTF API POST 远程连接

java - 集成spring mvc和Jersey,在查看jersey端点时获取空指针

scala - SBT 无法解决 jersey-container-grizzly2-http 2.5.1 的依赖关系

java - "Make Binary"在单个图像和堆栈之间切换背景

java - 运行 Selenium 的问题

java - Exoplayer ui分屏添加双击前进/后退循环效果