過去 6 か月間、あるプロジェクトに取り組んできました。このプロジェクトでは、Web サービスがデプロイされている Glassfish サーバー インスタンスがあります。クライアント側では、BASIC 認証を使用して Jersey (XML 要求/応答、JSON なし) で REST 要求を行う JavaFX2.2 を使用しています。
ユーザーがプログラム (JWS/JNLP) を開始すると、通常は、独自に作成したログイン ウィンドウに資格情報を入力し、ログイン ボタンを押して作業を開始します。ただし、7u21 以降、何らかの理由で (おそらく 7u21 でセキュリティが変更されたため)、追加の Java "Authentication Required" ポップアップが表示されました。
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 を介して、または .jnlp の代わりに .jar ファイルを使用してプログラムを開始すると、すべてが意図したとおりに機能することです (追加の認証ポップアップもエラーもありません)。したがって、これは Java で何かを行う必要があります。ウェブスタートだと思いますか?
編集 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 に署名する必要がありますか? 複数のjarファイルに対して同じことを示しています。プロジェクトをビルドすると、すべてが独自のキーストアで署名されますが、これは大きな問題ですか? これは、jar ファイルが信頼できる CA (もちろん無料ではない) によって作成された証明書で署名されている場合にのみ、JNLP が適切に機能することを意味しますか?
編集 2013 年 6 月 4 日:
GlobalSign からコード署名証明書を購入し、自分のマシンにインストールしました。PFX 証明書ファイルを Java Key Store (JKS) に変換し、それを使用して (Netbeans で) 私の jar に署名しました。その後、ジャーを確認しましたが、すべて問題ないようです。ただし、Webサーバー上のファイルを更新し、JNLPファイルを介してプログラムを起動しましたが、それでも同じ動作です..必死になる時間です!
2013年6月6日編集:
わかりました、別のアプローチを開始しました。テストとして、Jersey の代わりに HTTPUrlConnection() を使用して XML データを取得しようとしました。
7u21 を使用して http GET 要求を実行すると、同じ「認証が必要です」ウィンドウが表示されます。7u17 では、XML 応答を受け取ります。何が間違っているのか、まだ誰も手がかりを得ていませんか?BASIC認証を使用しているため、これは何か関係がありますか? これはサーバー関連でしょうか?これは JNLP ファイルと関係がありますか? この質問を検索すればするほど、より多くの質問があるようです:)