2008-09-17 14 views
4

Ich renne Blazeds auf der Serverseite. Ich möchte HTTP-Anfragen mit einem http-Header filtern. Mein Ziel ist es, zusätzliche Parameter an den Server zu senden, ohne die Signaturen meiner Blazeds-Dienste zu ändern.Wie wird ein HTTP-Header bei Verwendung einer Flex RemoteObject-Methode festgelegt?

Auf der Clientseite verwende ich Flex RemoteObject Methoden.

Mit Flex WebService-Komponenten ist es möglich, einen http-Header mit der Eigenschaft httpHeaders festzulegen. Ich habe nichts ähnliches auf der RemoteObject-Klasse gefunden ...

Antwort

0

Sie könnten versuchen, das Rad neu zu erfinden. Gibt es einen Grund, warum Sie die Standard HTTP (s) -Authentifizierung nicht verwenden können?

+0

Nein Ich kann HTTP authenticvcation nicht verwenden, ich habe einen sehr spezifischen Bedarf. –

1

RemoteObject verwendet AMF als Datenkanal und wird auf eine völlig andere Weise als HttpService oder WebService (die Http verwenden) verwaltet. Was Sie tun können, ist setCredentials(username,password) anrufen und dann auf der Serverseite mit dem FlexLoginCommand (entweder die Standard-für Ihren Container, oder leiten Sie Ihre eigenen). Lookup setCredentials und wie Sie dies auf beiden Seiten (Client und Server) behandeln.

+3

RemoteObject-Aufrufe werden über HTTP ausgeführt, der Inhalt ist nur im Action Message Format (AMF) codiert. –

0

Ein Grund, warum ich dachte, auch HTTP-Header zu verwenden, war, dass der Server den Flex-Client im Kontext der Service-Versionierung "erkennen" konnte. Auf dem Server kann ich immer eine Indirection/Proxy erstellen, die es den verschiedenen Clients erlauben würde, je nach Client-Version nur einen Endpunkt zu verwenden und zum richtigen Adapter zu routen. Die Frage ist auf der Client-Seite. Wie würde der Server das Flex-Client-Token oder die 'Version' identifizieren? Ein Weg ist sicherlich über die Authentifizierung. Aber vorausgesetzt, dass keine Authentifizierung beteiligt ist?

1

Ich habe ähnliches Problem, und ich fürchte, es gibt keine einfache Möglichkeit, HTTP-Header bei Verwendung von AMF zu setzen. Aber ich habe folgende Lösung entworfen.

Flex verwendet HTTP zum Übertragen von AMF, ruft es aber über Browserschnittstellen auf, damit Sie Cookies setzen können. Gerade in dem Dokument nach der Anwendung invoke JavaScript enthält

document.cookie="clientVersion=1.0;expires=2100-01-01;path=/"; 

Browser sollte es an den Server übertragen, und Sie können Filter (Problem sein wird, wenn der Benutzer Cookies ausgeschaltet haben).

Viel mehr können Sie JavaScript-Funktionen von Flex aufrufen (mehr ist hier: http://livedocs.adobe.com/flex/3/html/help.html?content=passingarguments_4.html).

2

könnte ich HTTP-Anforderung von flex ändern, stattdessen kann ich benutzerdefinierte Header zu dem mx.messaging.messages.IMessage hinzufügen, dass RemoteObject an den Server sendet und dort erstreckt flex.messaging.services.remoting.adapters.JavaAdapter (verwendet für den Zugriff auf Spring-Beans), ist es posible die Header-Parameter zu lesen und sie setzen in die HTTPRequest.

Im Flex-Teil hatte ich mx.rpc.AsyncRequest zu verlängern: eine neue Eigenschaft „Header“ deklariert und überschreibt Methode aufrufen, die es überprüft, ob ein nicht Nullwert für setzen die msg.headers ist.

und mx.rpc.remoting.mxml.RemoteObject: der Konstruktor erstellt eine neue Instanz der benutzerdefinierten AsyncRequest und überschreiben alte AsyncRequest und definiert eine setHeaders Methode, die das Argument der benutzerdefinierten AsyncRequest gesetzt.

com.asfusion.mate.actions.builders.RemoteObjectInvoker (Extra: P): dies liest man die param in der Karte des Mate-erklärte RemoteObjectInvoker und setzt im RemoteObject-Header.

Ich hoffe, es verständlich sein wird (mit meinem Apache Englisch xDDD)

Bye. Agur!

-1

Sie können die $ GLOBALS in PHP debuggen, um das zu sehen. Ich denke, das in den

$GLOBALS['HTTP_RAW_POST_DATA']; 

ist, oder Sie können einfach tun

file_get_contents('php://input'); 
0

Wir führen vor kurzem in das gleiche Problem, und das ist, wie wir unsere benutzerdefinierten Header hinzugefügt, um eine Unterklasse ohne erstellen:

var operation:AbstractOperation = _remoteSession.getOperation('myRemoteOperation'); 
var async:AsyncRequest = operation.mx_internal::asyncRequest; 
async.defaultHeaders = {my_header:'my_value'}; 

Das AsyncRequest-Objekt ist tatsächlich über das Operationsobjekt über den Namespace mx_internal zugänglich.

2

Das ist für mich gearbeitet BlazeDS und Spring-Flex 1.5.2

Flex mit:

use namespace mx_internal; 

var service:RemoteObject = new RemoteObject(destination); 
var operation:Operation = service[functionName]; 
operation.asyncRequest.defaultHeaders = {company:'company'}; 

var token:AsyncToken = operation.send(); 

Java Frühlings-Flex:

public class FlexJavaCustomAdapter extends JavaAdapter{ 
    @Override 
    public Object invoke(Message message) { 
     String locale = (String) message.getHeader("com.foo.locale"); 
     return super.invoke(message); 
    } 
} 

Dispatcher-servlet.xml

<bean id="customAdapter" class="org.springframework.flex.core.ManageableComponentFactoryBean"> 
      <constructor-arg value="com.codefish.model.flex.FlexJavaCustomAdapter"/> 
     </bean> 

     <flex:message-broker id="_messageBroker" services-config-path="classpath*:/com/codefish/resources/spring/services-config.xml" > 
       <flex:remoting-service default-adapter-id="customAdapter" 
      default-channels="my-amf, my-secure-amf" /> 
     </flex:message-broker> 
</bean>