2

Openfire サーバーに接続する XMPP と Smack API に基づいてチャット サーバーを開発しています (私と一緒にこれを開発している友人がホストしています)。

そこで、ほんの数日前にプログラミングを開始し (OS X 10.8 の Netbeans)、今日は接続とログインの側面に取り掛かりました。

ユーザー名 + パスワード :P の正しい選択で完全にログインできますが、無効なログイン試行を処理してアプリにメッセージを表示させ、ユーザーが再試行できるようにする方法がわかりません。

ユーザーがSwing JFormでボタンを押した後に起動する私のコードは次のとおりです。

(注: XMPPConnection オブジェクトは既に別のクラスで作成されており、サーバーへの接続が確立されています。別のクラスからオブジェクトを呼び出していることがわかります)

private void btnIniciarSesionActionPerformed(java.awt.event.ActionEvent evt) {                                                 
    String Usuario = txtUsuario.getText();
    String Password = new String (pwdContrasena.getPassword());

    if (Usuario.equals("") || Password.equals("")){
        // Missing data
        JOptionPane.showMessageDialog(null, "Missing data");
    }
    else{
        //Try to login
        try{
            Proyecto_chat.conexion.login(Usuario, Password, "x");
        }
        catch (XMPPException ex){
            Logger.getLogger(Ventana_login.class.getName()).log(Level.SEVERE, null, ex);
            // Problem
        }
        if (Proyecto_chat.conexion.isAuthenticated() == true){  //Login has been successful
            jLabel1.setVisible(false);
            System.out.println("Authenticated as " + Usuario);
            JOptionPane.showMessageDialog(null, "Authenticated as " + Usuario);
            //Exit login window and carry on  
        }
        else{
            JOptionPane.showMessageDialog(null, "login error");
        }
    }
}

私が得ているその例外で遊ぶべきですか?->

SEVERE: null
SASL authentication DIGEST-MD5 failed: not-authorized: 
at org.jivesoftware.smack.SASLAuthentication.authenticate(SASLAuthentication.java:337)
at org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:203)
at proyecto_chat.Ventana_login.btnIniciarSesionActionPerformed(Ventana_login.java:159)
at proyecto_chat.Ventana_login.access$100(Ventana_login.java:15)
at proyecto_chat.Ventana_login$2.actionPerformed(Ventana_login.java:73)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
(...) more lines that I think are not critical for this

アプリケーション内からパスワードを簡単に変更できるように、パスワードはプレーン テキスト (大学のプロジェクトなので問題ありません) で保存されるため、クライアント コンピューターからデータベース (リモート サーバーの PostgreSQL) に接続し、パスワードを確認するだけで済みます。 user&pass が一致する場合は 'conexion.login' を実行しますが、それは... わかります... 間違っています

うまくいかずにウェブを見回した後、私はここに向かい、質問し、寝て、翌朝起きていくつかの提案をすることにしました;)助けていただければ幸いです

4

2 に答える 2

1

あなたが尋ねていることを理解できるかどうかはわかりませんが、「Smack でログイン試行が失敗した理由をどのように判断できますか?」次に、ここに私の答えがあります:

ログインに失敗した理由を特定したい場合は、Smack 3.2.2 以降の (XMPP)Exception のメッセージ文字列を評価する必要があります。さまざまな失敗の理由を区別するこれらのメッセージ文字列は、現在、ソースにハードコードされていますが、これは通常はお勧めできません。

少し前に、この問題に対処するために、SMACK-416 "Improve Exceptions on connect() and login()"を作成しました。アイデアは、ハードコーディングされた文字列/失敗の理由をクラス階層に置き換えることです。しかし、これが実装されるまでには数か月かかることは間違いありません (リリースされるまでには数週間/数か月/数年かかるかもしれません)。

于 2013-03-28T13:13:27.377 に答える
1

実際、主な問題は、無効なユーザー名/パスワードを使用してログインしようとすると、いくつかの例外がスローされ (セットアップした情報表示と同様に)、アプリケーションが再度ログインできないことでした (データを修正し、もう一度ボタンをクリックしました)。

最後に、.connect() を .login() メソッドのすぐ後ろに配置し、不正なログインが行われた場合に .disconnect() を呼び出すことでこれを解決しました。これにより、ユーザーがログインを試行するたびにサーバーが再接続されます。

これは理想的なアプローチではないかもしれませんが、簡単で実行可能だと思います。助けてくれてありがとう!

于 2013-03-28T16:34:23.287 に答える