2017-01-19 3 views
0

Je vise à avoir un client bayeux à l'écoute du serveur pour les messages. Cependant, j'ai encore du mal à faire la connexion avec le serveur du client Bayeux. Le serveur nécessite des informations d'identification de connexion. Mais j'ai trouvé de nombreux exemples sans aucun détail de connexion. En utilisant quelques exemples, j'ai trouvé que l'objet client bayeux avait besoin de l'objet LongPollingTransport. qui contient un httpclient. Cependant, je veux faire d'abord une poignée de main afin que je sache que la connexion fonctionne alors je devrais commencer à écouter le serveur sur le canal/test/temp. L'URL du serveur est (url = "https://manse.abcd.fi";) et le client définition donnée ci-dessous.Mais puisque l'URL http Bayuex nécessite une connexion. Comment puis-je passer le login (utilisateur et mot de passe) pour établir la connexion. Je pense qu'il devrait être donné quelque part dans la classe LongPollingTransport. Jusqu'à présent, j'ai échoué à se connecter.Comment passer les informations de connexion du serveur dans bayuexclient?

import org.cometd.bayeux.Channel; 
    import org.cometd.bayeux.Message; 
    import org.cometd.bayeux.client.ClientSessionChannel; 
    import org.cometd.bayeux.client.ClientSessionChannel.MessageListener; 
    import org.cometd.client.BayeuxClient; 
    import org.cometd.client.transport.ClientTransport; 
    import org.cometd.client.transport.LongPollingTransport; 
    import org.eclipse.jetty.client.ContentExchange; 
    import org.eclipse.jetty.client.HttpClient; 

    import java.net.MalformedURLException; 
    import java.net.URL; 
    import java.util.HashMap; 
    import java.util.Map; 

    public class Test { 

      public static void main(String[] args) { 
       HttpClient httpClient = new HttpClient(); 
       // LongPollingTransport transport = new LongPollingTransport(options, httpClient); 
       String url = "https://manse.soneraiox.fi"; 

       //LongPollingTransport transport = new LongPollingTransport(url, null, httpClient); 

       // String url = "https://manse.soneraiox.fi"; 
       BayeuxClient client = new BayeuxClient(url, LongPollingTransport.create(null)); 
       //System.out.println(client.isHandshook); 
       // Handshake 
       client.handshake(); 
       Boolean a=client.isHandshook(); 
       System.out.println(a); 

       System.out.println(client.isConnected()); 

Ce code donne toujours faux. Je ne suis toujours pas sûr si le LongPollingTransport.create (null) fonctionne ou pas. J'ai utilisé le même espace de noms que vous avez suggéré. Est-ce que c'est ok?

import org.cometd.bayeux.Channel; 
import org.cometd.bayeux.Message; 
import org.cometd.bayeux.client.ClientSessionChannel; 
import org.cometd.bayeux.client.ClientSessionChannel.MessageListener; 
import org.cometd.client.BayeuxClient; 
import org.cometd.client.transport.ClientTransport; 
import org.cometd.client.transport.LongPollingTransport; 
import org.eclipse.jetty.client.ContentExchange; 
import org.eclipse.jetty.client.HttpClient; 

import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.HashMap; 
import java.util.Map; 

public class Stest { 

     public static void main(String[] args) { 
      HttpClient httpClient = new HttpClient(); 
      // LongPollingTransport transport = new LongPollingTransport(options, httpClient); 
      String url = "https://manse.soneraiox.fi"; 

      //LongPollingTransport transport = new LongPollingTransport(url, null, httpClient); 

      // String url = "https://manse.soneraiox.fi"; 
      BayeuxClient client = new BayeuxClient(url, LongPollingTransport.create(null)); 
      //System.out.println(client.isHandshook); 
      // Handshake 
      Map<String, Object> extra = new HashMap<>(); 
      Map<String, Object> ext = new HashMap<>(); 
      extra.put(Message.EXT_FIELD, ext); 
      Map<String, Object> authn = new HashMap<>(); 
      ext.put("com.acme.authn", authn); 
      authn.put("username", "[email protected]"); 
      authn.put("password", "xxxxx"); 
      client.handshake(extra); 
      //client.handshake(); 
      Boolean a=client.isHandshook(); 
      System.out.println(a); 

      System.out.println(client.isConnected()); 

     } 
     } 

Répondre

0

Vous pouvez lire la documentation sur CometD authentication comme base.

La réponse à cette question dépend vraiment des détails d'authentification.

Si vous gérez l'authentification via l'application (et non via HTTP Basic standard/Digest), vous pouvez transmettre les informations d'authentification comme des champs supplémentaires dans la poignée de main:

BayeuxClient client = ...; 
Map<String, Object> extra = new HashMap<>(); 
Map<String, Object> ext = new HashMap<>(); 
extra.put(Message.EXT_FIELD, ext); 
Map<String, Object> authn = new HashMap<>(); 
ext.put("com.acme.authn", authn); 
authn.put("username", "foo"); 
authn.put("password", "bar"); 
client.handshake(extra); 

Il est bon de « espace de noms » champs supplémentaires, comme fait dans l'exemple ci-dessus avec le champ com.acme.authn.

L'exécution de l'authentification via CometD présente l'avantage de fonctionner avec n'importe quel transport, HTTP (HTTP/1.1 ou HTTP/2) ou WebSocket. Vous pouvez également effectuer une authentification par d'autres moyens, puis transmettre les jetons d'authentification à CometD. Par exemple, les authentifications basées sur HTTP établissent typiquement un cookie qui doit être passé dans chaque requête suivante et qui est validé par le serveur.

// External authentication yields a cookie. 
HttpCookie cookie = authenticate(); 

BayeuxClient client = ...; 
client.putCookie(cookie); 
client.handshake(); 

Il y a pratiquement infinies variations sur la façon dont vous pouvez authentifier l'extérieur, puis passer le jeton d'authentification à cometd, mais jusqu'à présent cometd a été suffisamment souple pour accueillir la plupart, sinon tous.

Vous ne donnez pas assez de détails pour une réponse précise, mais ce qui précède devrait vous aider à démarrer.

+0

Sbordet, j'ai essayé comme vous l'avez suggéré. Mais la poignée de main n'a pas fonctionné. Pouvez-vous me dire si j'ai utilisé correctement l'espace de noms et la classe LongPollingTransport? –

+0

Quelle version de CometD utilisez-vous? 'LongPollingTransport.create()' n'existe pas dans CometD 3.x. Stick avec CometD 3.1.x. Vous ne pouvez pas imprimer pour consolider l'état de 'BayeuxClient' juste après avoir appelé' handshake() 'car l'établissement de la liaison est une opération asynchrone. Veuillez lire la [documentation] (https://docs.cometd.org/current/reference/#_java_client_handshake). Une fois que vous avez correctement transmis les informations d'identification au serveur, vous devez les valider comme expliqué dans la [documentation d'authentification] (https://docs.cometd.org/current/reference/#_java_server_authentication). – sbordet

+0

http://stackoverflow.com/questions/41830883/how-the-java-client-in-cumulosity-listens-to-events –