2013-05-18 86 views
10

过去6个月我一直在为一个项目工作。对于这个项目,我有一个glassfish服务器实例,部署了一个web服务。在客户端,我正在使用JavaFX2.2,它使用BASIC身份验证对Jersey执行REST请求(XML请求/响应,无JSON)。7u21更新后弹出验证窗口

当用户启动程序(JWS/JNLP)时,通常他们只需在自己创建的登录窗口中输入凭据,按登录按钮即可开始工作。但是自7u21以来,由于某种原因,我得到了一个额外的Java“Authentication Required”弹出窗口(可能是因为7u21中安全性的改变)。

Authentication required pop-up

可以肯定它有无关的Java版本之间的兼容性问题,我更新了服务器以及到7u21,所以:

  • 客户:从7u17更新Java来7u21
  • 服务器:从7u09到7u21更新的Java,调整的GlassFish asenv.bat文件,以使用新的JDK

如果我打的取消按钮我上述N所示的“需要验证”的窗口,该程序的功能启动你,但这样做请求时它不运行稳定:使用GET方法时

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 

此错误发生随机(未与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只能正常运行?

EDIT 2013年6月4日:

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

EDIT 2013年6月6日:

好吧,开始了不同的方法。作为测试的问题,我试图通过使用HTTPUrlConnection()而不是泽西来获取XML数据:

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

+0

你解决了吗?我试着按照dennis-the-menace所接受的答案的建议无济于事。关于缓存控制,您是否更改过任何服务器端? – aioobe

+0

嗨aioobe,你可以在这里找到答案:http://stackoverflow.com/questions/17278303/basic-authentication-fails-with-glassfish – Perneel

回答

2

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

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

0

答案就在这里:

Java Web Start keeps asking to authenticate

我不知道为什么你之前没遇到此问题。在以前版本的Java Web Start或以前版本的浏览器中,这可能是一个安全问题。

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

+1

它不是真的一样,因为我不必通过网站身份验证(那里没有)到Java。所有的认证都发生在程序本身中。因此,用户只需单击超链接到JNLP文件,程序就会通过JWS启动,用户可以看到(自己创建的)登录窗口。他或她输入凭证并继续工作。我以前从未有过额外的Java认证窗口,所以我都为此感到困惑:) – Perneel

+0

更多的测试似乎表明它与7u21有关。以前的Java版本没有这个问题似乎...任何想法? – Perneel

+1

不确定,但这可能与您的问题有关:http://www.oracle.com/technetwork/java/javase/tech/java-code-signing-1915323.html(7u21似乎介绍了一些与安全相关的更改) 。 –

0

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

IE浏览器 - >添加域到你的“内联网”区域中的站点列表; Chrome - >将例外添加到您想要允许非垃圾邮件插件访问的域名列表中。

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

至于IE解释说:

如果从插件访问是来自“内联网”区外的要求,它会自动认为不够安全,以传递任何用户名/密码信息,以请求域。因此,登录弹出窗口为客户提供凭据。将域添加到“Intranet”区域将在大多数情况下解决此问题。