繁体   English   中英

更新7u21后,需要验证身份窗口弹出

[英]Authentication required window popping up after 7u21 update

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

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

需要身份验证弹出窗口

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

  • 客户:从7u17到7u21更新了java
  • 服务器:更新了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日志,所以它必须做一些签署罐子的事情? 它为多个jar文件显示了同样的事情。 在构建项目时,所有内容都使用自己的密钥库进行签名,这是一个大问题吗? 这是否意味着如果罐子用可信CA(不是免费的)创建的证书签名,JNLP只能正常工作?

编辑2013年6月4日:

我给自己买了一张GlobalSign的代码签名证书,将它安装到我的机器上。 将PFX证书文件转换为Java密钥库(JKS)并使用该密钥库签署我的jar(在Netbeans中)。 之后验证了罐子,一切似乎都没问题。 但是,我更新了网络服务器上的文件,通过JNLP文件启动了程序,但仍然是相同的行为..时间变得绝望!

编辑2013年6月6日:

好吧,开始采用不同的方法。 作为测试问题,我尝试使用HTTPUrlConnection()而不是Jersey来获取XML数据:

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

我对你的后续问题的回答也应该回答这个问题。

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

答案在这里:

Java Web Start一直要求进行身份验证

我不知道为什么你以前没有经历过这种行为。 在以前版本的Java Web Start或以前版本的浏览器中,这可能是一个安全问题。

我不认为IO错误是相关的。

这些类型的问题通常可以通过浏览器设置解决:

IE - >将域添加到“Intranet”区域站点列表中; Chrome - >将例外添加到您要允许未经过沙盒访问的插件访问的域列表中。

如果您处于托管企业环境中,则会将问题转发给您的Internet安全人员,因为通常会禁用这些类型的设置。

正如IE所解释的:

如果从“Intranet”区域外部请求从插件进行访问,则会自动将其视为不够安全,无法将任何用户名/密码信息传递给请求域。 因此,登录弹出窗口为其提供来自客户端的凭据。 在大多数情况下,将域添加到“Intranet”区域将解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM