2013-05-18 20 views
10

Son 6 ayda bir proje üzerinde çalışıyorum. Bu proje için bir web servisinin konuşlandırıldığı bir glassfish sunucu örneğim var. İstemci tarafında, BASIC kimlik doğrulaması ile REST ile Jersey (XML istekleri/yanıtları, JSON yok) taleplerini yerine getiren JavaFX2.2 kullanıyorum. Kimlik doğrulaması gerekli pencere 7u21 güncellemesinden sonra açılır.

Kullanıcı programı (JWS/JNLP) başlattığında, normalde kendi giriş bilgilerini girilen bir giriş penceresinde girer, oturum açma düğmesine basıp çalışmaya başlar. Ancak 7u21'den beri, bazı nedenlerden dolayı (muhtemelen 7u21'de değiştirilen güvenlik nedeniyle) ekstra bir Java "Kimlik Doğrulama Gerekli" pop-up'ım var.

Authentication required pop-up

Java sürümleri arasındaki uyumluluk sorunları ile ilgisi yoktu emin olmak gerekirse, ben bu yüzden, 7u21 yanı sunucuyu güncelleme:

  • Müşteri: 7u17 güncellenen java
  • 7u21 için
  • Sunucu: Ben düğmesi i iptal vurursanız 7u21 için 7u09 güncellenen java, düzeltilmiş glassfish asenv.bat dosyası yeni jdk

kullanmak n "kimlik doğrulaması gerekli" penceresi programı binlik başlatmak yapar Yukarıda gösterilen ancak istekleri yaparken kararlı çalışmaz: GET yöntemi kullanılırken

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 

Bu hata rasgele oluşan (PUT ile test etmedim ya SİL), bu durumda getCowsByUserId() yöntemi vardı:

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; 
} 

Ben NetBeans üzerinden veya yerine .jnlp ait .jar dosyası ile programı başlattığınızda komik kısmı amaçlandığı gibi her şey çalışıyor, (no ekstra kimlik doğrulama pop-up'ları, hata yok) ... bu yüzden Java Web başlatıcısı ile bir şeyler yapmak zorundayım sanırım?

DÜZENLEME 28 May 2013:

Ben 7u17 ve 7u21 gelen java konsol izleme/ayıklama günlükleri karşılaştırarak biraz daha araştırma yaptım.

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 günlüğünde görünmüyor ilk satırı, bu kavanoz imzalanması ile bir şeyler yapmak zorunda böylece: Ben 7u21 günlüğüne aşağıdaki fark? Aynı şey birden fazla kavanoz dosyaları için gösterir. Projeyi oluştururken, her şey kendi anahtar teslimi ile imzalanır, bu büyük sorun mu? Bu, JNLP'nin yalnızca güvenilir bir CA tarafından yaratılan bir sertifika ile imzalanmışsa (ki bu ücretsiz değildir) makul bir şekilde çalışacağı anlamına mı geliyor?

DÜZENLEME 4 Haziran 2013:

Ben, GlobalSign dan kendime kod imzalama sertifikası satın benim makineye üzerine kurulu. PFX sertifika dosyasını bir Java Anahtar Deposuna (JKS) dönüştürdü ve kavanozlarımı imzalamak için (Netbeans'da) kullanıldı. Daha sonra kavanozları doğruladı ve hepsi iyi görünüyor. Ancak, web sunucusu üzerindeki dosyaları güncelledim, programı JNLP dosyası aracılığıyla başlattım ama yine de aynı davranış .. umutsuzluk zamanı!

DÜZENLEME 6 Haziran 2013:

Tamam, farklı bir yaklaşım başladı.Testin bir sonucu olarak, XML verisini Jersey:

yerine HTTPUrlConnection() kullanarak almaya çalıştım. 7u21 kullanırken http GET isteği yaparken aynı 'Kimlik Doğrulama Gerekli' penceresini alıyorum. 7u17 ile XML yanıtını alıyorum. Hala neyin yanlış olabileceğine dair bir ipucu yok mu? Bu, BASIC kimlik doğrulamasını kullandığım için yapacak bir şey olabilir mi? Bu sunucu ile ilgili olabilir mi? Bunun JNLP dosyasıyla bir ilgisi olabilir mi? Bu soru için arama daha cevaplar, daha fazla soru ben öyle görünüyor :)

+0

Bunu çözdünüz mü? Kabul edilen cevapta tavsiyeyi dennis-the-menace ile boşuna hiçbir şekilde değerlendirmeyi denedim. Önbellek denetimi ile ilgili sunucu tarafını değiştirdiniz mi? – aioobe

+0

Merhaba aioobe, cevabı burada bulabilirsiniz: http://stackoverflow.com/questions/17278303/basic-authentication-fails-with-glassfish – Perneel

cevap

2

follow-up question cevabım da bu soruyu yanıtlamalıdır.

Kısaca: Java Web Start, JDK7'de varsayılan olarak HTTP yanıtlarını önbelleğe alır ve önbellek denetimi üstbilgisini, istemci isteğinizde ve önbelleksiz REST hizmetinin yanıtlarında "no-cache, no-store" olarak ayarlamanız gerekir. .

0

cevabı burada: Daha önce bu davranışı yaşamadım neden bilmiyorum

Java Web Start keeps asking to authenticate

. Java Web Start'ın önceki sürümlerinde veya tarayıcınızın önceki sürümlerinde bir güvenlik sorunu olabilir.

IO hatasının ilişkili olduğunu düşünmüyorum.

+1

Gerçekten aynı değil çünkü web sitesi kimlik doğrulaması geçmek zorunda değilsiniz (orada Java değildir. Tüm kimlik doğrulaması programın kendisinde gerçekleşir. Dolayısıyla, kullanıcı JNLP dosyasına bir köprü tıklar, program JWS aracılığıyla başlatılır ve kullanıcı (kendi) giriş penceresini görür. O kimlik bilgilerini girer ve çalışmaya devam eder. Daha önce hiç bir Java Kimlik Doğrulama pencerem olmadı, bu yüzden bu yüzden şaşkınım :) – Perneel

+0

Daha fazla test, 7u21 ile bir ilgisi olduğunu gösteriyor. Java'nın önceki sürümlerinde bu sorun yok gibi görünüyor ... Herhangi bir fikir? – Perneel

+1

Emin değilim, ancak bu sorununuzla bağlantılı olabilir: http://www.oracle.com/technetwork/java/javase/tech/java-code-signing-1915323.html (7u21, güvenlikle ilgili bazı değişiklikler getiriyor gibi görünüyor) . –

0

sıklıkla tarayıcı tarafından çözülebilir sorunlar bu tip ayarları:

IE -> eklenti alanı 'intranet' bölge siteleri listenize; Korumalı olmayan eklenti erişimine izin vermek istediğiniz alanların listesine istisna eklemek için Chrome ->.

Yönetilen bir Enterprise ortamındaysanız, bu tür ayarlar genellikle plebler için devre dışı bırakıldıkları için, sorunu Internet güvenlik personelinize iletin.

olarak IE için açıkladı: bir eklenti gelen erişim 'intranet' bölgesinin dışından isteniyorsa

, otomatik olarak talepte bulunan alanına yapılan kullanıcı adı/şifre bilgileri aktarmak için yeterince güvenli değildir kabul edilir. Bu nedenle, istemciden kimlik bilgilerini sağlamak için giriş açılır. Alanı 'intranet' bölgesine eklemek çoğu durumda bu sorunu çözecektir.