2008-09-17 4 views
4

Я запускаю blazeds на стороне сервера. Я хотел бы фильтровать http-запросы, используя http-заголовок. Моя цель - отправить дополнительные параметры на сервер, не меняя подписи моих служб blazeds.Как установить HTTP-заголовок при использовании метода Flex RemoteObject?

На стороне клиента, я использую Flex RemoteObject методов.

С компонентами Flex WebService можно установить http-заголовок, используя свойство httpHeaders. Я не нашел ничего подобного в классе RemoteObject ...

ответ

0

Возможно, вы пытаетесь заново изобрести колесо. Есть ли причина, по которой вы не можете использовать стандартную HTTP-аутентификацию?

+0

Нет Я не могу использовать аутентификацию HTTP, у меня есть очень специфическая потребность. – 2008-09-17 20:12:29

1

RemoteObject использует AMF как канал данных и управляется совершенно по-другому, чем HttpService или WebService (которые используют Http). Что вы можете сделать, это позвонить setCredentials(username,password), а затем захватить его на стороне сервера, используя FlexLoginCommand (либо стандартный для вашего контейнера, либо получить свой собственный). Поиск setCredentials и как вы должны обрабатывать это с обеих сторон (клиент и сервер).

+3

Вызовы RemoteObject выполняются по протоколу HTTP, это просто, что содержимое кодируется в формате текстовых сообщений (AMF). – 2009-03-20 20:37:18

0

Причина, по которой я думал об использовании заголовков http, заключалась в том, что сервер мог «распознавать» клиента flex в контексте служебной версии. На сервере я всегда могу создать косвенное/прокси-сервер, позволяющий различным клиентам использовать только одну конечную точку и маршрут к правильному адаптеру в зависимости от версии клиента. Вопрос на стороне клиента. Как сервер идентифицирует токен гибкого клиента или «версию». Один из способов - это, конечно, аутентификация. Но, предполагая, что не используется аутентификация?

1

У меня есть аналогичная проблема, и я боюсь, что нет простого способа установить HTTP-заголовок при использовании AMF. Но я разработал следующее решение.

Flex использует HTTP для передачи AMF, но вызывает его через интерфейсы браузера, это позволяет вам устанавливать cookie. Просто в документе, содержащего Invoke приложения следующий JavaScript

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

браузер должен передать его на сервер, и вы можете фильтровать (проблема будет, если пользователь будет иметь печенье выключено).

Значительно больше вы можете вызывать функции JavaScript из Flex (подробнее здесь: http://livedocs.adobe.com/flex/3/html/help.html?content=passingarguments_4.html).

2

Я не мог изменить запрос HTTP из гибкого, вместо этого я могу добавить пользовательские заголовки к mx.messaging.messages.IMessage, что RemoteObject посылает на сервер и там, простирающийся flex.messaging.services.remoting.adapters.JavaAdapter (используется для получения доступа к пружине бобов), это Возможное прочитать параметры заголовка и поместить их в HTTPRequest.

В гибкой части, я должен был продлить mx.rpc.AsyncRequest: объявляет новое свойство «заголовок» и перезаписывает вызвать метод, который проверяет, есть ли не нулевое значение для установленного в msg.headers.

и mx.rpc.remoting.mxml.RemoteObject: конструктор создает новый экземпляр нашего обычая AsyncRequest и перезаписать старый AsyncRequest и определяет метод setHeaders, который устанавливает аргумент обычаю AsyncRequest.

com.asfusion.mate.actions.builders.RemoteObjectInvoker (дополнительно: P): это один читает из параметров, объявленных в карте спаривается в RemoteObjectInvoker и помещает в заголовке RemoteObject.

Я надеюсь, что это будет понятно (с моим апачом английского XDDD)

Bye. Agur!

-1

Вы можете отлаживать $ GLOBALS в PHP, чтобы увидеть это. Я думаю, что это в

$GLOBALS['HTTP_RAW_POST_DATA']; 

или вы можете просто сделать

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

Недавно мы столкнулись с той же проблемой, и это, как мы добавили наши собственные заголовки без создания подкласса:

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

Объект AsyncRequest фактически доступен через объект операции через пространство имен mx_internal.

2

Это работает для меня с помощью BlazeDS и Весна-Flex 1.5.2

Flex:

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 Spring-Flex:

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

диспетчерскую-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>