2009-05-27 4 views
1

Ich versuche, ein Modul für eine Flex-Anwendung zu erstellen, und ich möchte Benachrichtigungen an Clients senden. Ich habe mir den BlazeDS-Messaging-Dienst angeschaut, um die Benachrichtigungen an die Clients zu senden, aber ich möchte bestimmte Updates an bestimmte Clients senden können. Das Flex-Benachrichtigungsframework scheint dies nicht zuzulassen - wenn wir beispielsweise ein Feld in der Nachricht mit einem Wert der Benutzer-ID des Benutzers haben, könnte jeder Client theoretisch alle Nachrichten für eine gegebene Benutzer-ID abonnieren, und es gibt keine Verifizierung an die Serverseite, um sicherzustellen, dass der Client, der abonniert hat, als diese Benutzer-ID angemeldet ist.Flex Messaging Security

Gibt es etwas, das ich hier verpasst habe, oder ist das der beste Weg, damit umzugehen, meinen eigenen Abrufmechanismus auf der Clientseite zu schreiben?

Antwort

1

Es gibt tatsächlich eine Lösung dafür in den APIs. Der erste Schritt besteht darin, eine Klasse zu schreiben, die die FlexClientOutboundQueueProcessor-Klasse erweitert. Sie benötigen eine Methode außer Kraft zu setzen:

public void add(List outboundQueue, Message message); 

Im Grunde alles, was Sie tun müssen, ist eine gewisse Logik schreiben, um zu bestimmen, ob Sie den folgenden Aufruf machen sollte:

outboundQueue.add(message) 

Einfach gesagt, wenn Sie nicht hinzufügen die Nachricht an die Warteschlange, dann wird die Nachricht nicht an den Client gesendet. Die andere wichtige Methode in dieser Klasse ist:

FlexClient getFlexClient() 

Welche Sie das dazugehörige FlexSession zu erhalten und letztlich die Authentifizierungsinformationen verwenden können, die vermutlich in der App vorhanden ist.

Sobald dies erledigt ist, müssen Sie nur den Prozessor mit den entsprechenden Kanälen registrieren. Fügen Sie einfach dieses Element im „Eigenschaften“ Element des „Kanal-Definition“ Elements:

<flex-client-outbound-queue-processor class="com.foo.YourProcessor"/> 

Ich glaube, Sie auch ein verschachteltes „Eigenschaften“ Element für den Warteschlangenprozessor angeben können, aber ich glaube nicht, es ist erforderlich .

+0

Danke! Hier ist jedoch eine Sache zu beachten: Während dies genau die Klasse ist, nach der ich gesucht habe, gab es ein paar Probleme, denen ich bei der Entwicklung einer Lösung begegnet bin. Der erste war, dass getFlexClient(). GetFlexSession() hatte immer einen Null-Wert getUserPrincipal() - versucht, Zugriff auf die gleiche Eigenschaft über die FlexContext.getFlexSession() einen Benutzerprinzipal zurückgegeben - aber nicht in der Funktion hinzufügen. Die Funktion add wird aufgerufen, wenn der Wert der ausgehenden Warteschlange hinzugefügt wird. Zu diesem Zeitpunkt ist die FlexContext.getFlexSession() leer. Der einzige Ort, den ich finden könnte, um richtig zu überschreiben, ist flush(). –