Как установить HTTP-заголовок при использовании метода Flex RemoteObject?

Я использую плагины на стороне сервера. Я хотел бы фильтровать HTTP-запросы с помощью HTTP-заголовка. Моя цель - отправить на сервер дополнительные параметры без изменения подписей моих сервисов blazeds.

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

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


person Alexandre Victoor    schedule 17.09.2008    source источник


Ответы (8)


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

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

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

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

Надеюсь будет понятно (с моим apache english xDDD)

Пока. Агур!

person hongo    schedule 05.07.2010

Это сработало для меня, используя BlazeDS и Spring-Flex 1.5.2.

Гибкость:

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);
    }   
}

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>
person Ronny Shibley    schedule 03.04.2015

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

person Verdant    schedule 25.09.2008
comment
Вызовы RemoteObject выполняются через HTTP, просто содержимое кодируется в формате сообщения действия (AMF). - person cliff.meyers; 20.03.2009

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

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

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

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

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

person Radek    schedule 01.07.2010

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

person Community    schedule 17.09.2008
comment
Нет, я не могу использовать HTTP-аутентификацию, у меня очень специфическая потребность. - person Alexandre Victoor; 18.09.2008

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

person Community    schedule 22.04.2009

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

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

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

person yiotix    schedule 04.11.2014

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

$GLOBALS['HTTP_RAW_POST_DATA'];

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

file_get_contents('php://input');
person Marcelo Rodovalho    schedule 12.03.2013