Как установить заголовок HTTP при использовании метода Flex RemoteObject? - PullRequest
4 голосов
/ 17 сентября 2008

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

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

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

Ответы [ 8 ]

3 голосов
/ 03 апреля 2015

Это сработало для меня, используя BlazeDS и Spring-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>
3 голосов
/ 05 июля 2010

Я не могу изменить запрос 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 (дополнительно: P): этот читает параметр, объявленный в карте Мате RemoteObjectInvoker и вставляет заголовок RemoteObject.

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

Bye. Agur!

1 голос
/ 01 июля 2010

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

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).

1 голос
/ 25 сентября 2008

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

0 голосов
/ 05 ноября 2014

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

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

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

0 голосов
/ 13 марта 2013

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

$GLOBALS['HTTP_RAW_POST_DATA'];

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

file_get_contents('php://input');
0 голосов
/ 22 апреля 2009

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

0 голосов
/ 17 сентября 2008

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

...