10

過去 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 ファイルと関係がありますか? この質問を検索すればするほど、より多くの質問があるようです:)

4

3 に答える 3

3

フォローアップの質問に対する私の回答は、この質問にも回答する必要があります。

つまり、Java Web Start はデフォルトで JDK7 の HTTP 応答をキャッシュし、クライアント要求と Jersey REST サービスによる応答で Cache-Control ヘッダーを「no-cache, no-store」に設定する必要があります。

于 2013-08-21T16:04:47.660 に答える
0

この種の問題は、多くの場合、ブラウザの設定によって解決できます。

IE ->ドメインを「イントラネット」ゾーン サイトのリストに追加します。 Chrome ->サンドボックス化されていないプラグイン アクセスを許可するドメインのリストに例外を追加します。

管理されたエンタープライズ環境にいる場合は、これらのタイプの設定は通常 pleb に対して無効になっているため、問題をインターネット セキュリティ スタッフに転送してください。

IEについて説明したように:

プラグインからのアクセスが「イントラネット」ゾーンの外から要求された場合、要求元のドメインにユーザー名/パスワード情報を渡すほど安全ではないと自動的に見なされます。したがって、クライアントからの資格情報を提供するためのログイン ポップアップが表示されます。ドメインを「イントラネット」ゾーンに追加すると、ほとんどの場合、この問題が解決されます。

于 2015-03-16T12:02:27.823 に答える