0

ユーザーがJava Web Startを介してJavaアプリケーションを開始できるJSF2サイトを開発しています。アプリは mp3 メタデータを解析し、解析された情報を含む xml ファイルを返します。

サーバーに送信される各ファイルのユーザーを識別する何らかの方法が必要ですが、これを行う方法がわかりません。

言い換えれば、目標は、ユーザーがサーバーに送信する前に、xml ファイルに userId を設定できるようにすることです。そのためには、何らかの方法でその ID を Java Web Start アプリケーションで使用できるようにする必要があります。

私の質問は次のとおりです。IDを取得するにはどうすればよいですか? 最終的な目標は、ユーザーの mp3 ファイルを解析し、メタデータをサーバーに戻すことです。より良い方法でそれを行う方法についてのアイデアは大歓迎です。たぶん、私の説明した方法は最善ではありません。

4

2 に答える 2

0

クライアントとして機能する Web Start アプリは、他のクライアントと同じ方法でサーバーに対して自身を識別することができます。つまり、セッションの開始時にユーザーをログインさせるだけです。ただし、デスクトップ クライアントはローカル ファイル システムにアクセスできるため、ユーザー情報をローカルに保存できます。これは、ユーザー ID や構成設定などのデータをローカル ハード ドライブに保存できることを意味します。デスクトップクライアントをプラットフォーム間で動作させたいため、開発者はこのアプリケーションがどのディレクトリから起動されているかを正確に知ることができない ため、ローカルファイルシステムの上に抽象化のレイヤーを提供するための設定 APIがあります。

ユーザーがこのアプリケーションを実行するたびに主に同じコンピューターを使用する場合、これは構成情報とユーザー設定を保存する最も便利な方法です。次に例を示します。

/**
 *
 * Loads the user preferences from local storage using the Preferences API.
 * The actual location of this file is platform and computer user-login
 * dependant, but from the perspective of the preferences API, it is stored in 
 * a node referenced by the package this class resides in.
 */
private void loadPrefernces() {
    try {
        prefs = Preferences.userNodeForPackage(this.getClass());
    }
    catch(SecurityException stop) {
        JOptionPane.showMessageDialog(null, "The security settings on this computer are preventing the application\n"
                + "from loading and saving certain user preference data that the program needs to function.\n"
                + "Please have your network administrator adjust the security settings to allow a Java desktop\n"
                + "application to save user preferences. The exception the program encountered is below:\n"
                + stop.toString(),
                "Security Error", JOptionPane.ERROR_MESSAGE);
    }
    catch(Exception some) {
        System.out.println("Other Preference Exception:");
        System.out.println(some);
    }
    //extract information from the prefs object:
    String username = prefs.get("user","default-newUser");
    String userID = prefs.get("id", "0"); //a 0 ID means that the information was not found on the local computer.
}

//Use this method to store username and ID on the local computer.
public void saveUserPrefs() {
    prefs.put("user", user.getUsername() );
    prefs.put("id", "" + user.getID());
}

もちろん、ユーザーがコンピューターでアプリケーションを初めて実行する場合や、ユーザーに ID が割り当てられていない場合、上記のコードは役に立ちません。したがって、いくつかのログイン機能を構築する必要があります。JNLP アプリケーションは、ブラウザと同じ方法で Web サーバーと通信できます。これを実装するには、httpClientライブラリが非常に役立つことがわかりました。ユーザーのブラウザーがプロキシの背後にある場合、Java アプリケーションがサーバーと通信できるようにするために、追加のコードが必要になる場合があります。

于 2012-10-14T12:14:58.343 に答える
0

ログイン ID を Web ブラウザーから別のアプリケーション (JNLP プログラムなど) に転送したい これは少し型破りなハックですが、うまくいくと思います:

  1. ユーザーが Web アプリにログインしたら、ユーザー ID と要求 IP アドレスをテーブルに格納します。これは、データベース テーブルまたはローカル ファイルである可能性があります。
  2. Java アプリが起動すると、getID リクエストがサーブレットに送信されます。
  3. サーブレットはリクエストの IP アドレスを検索し、ID で応答します。サーブレットは ID を送り返すだけで済みます。ID を XML や HTML でラップする必要はありません。

2 人の異なるユーザーがほぼ同時に同じ IP アドレスからログインしようとしていない限り、これは機能すると思います。同じネットワーク上の 2 人のユーザーがこのサービスを使用している場合、同じパブリック IP を共有するプライベート IP を持つコンピューターを使用している可能性があります。2 人のユーザーを区別するために、ローカル コンピューターに関する別の情報を保存する必要があります。たとえば、Java はコンピュータ名を簡単に読み取ることができます。ブラウザにそのようなものも読み取らせることができれば、これは IP アドレスと一緒にテーブルに追加され、重複 IP 問題を解決できます。このスタックオーバーフローの質問でいくつかのアイデアが言及されています

于 2012-10-14T14:54:25.493 に答える